2009-06-26 18 views
11

さまざまなことについて満足できるレベルの情報を保持しなければならない会社のためのシステムを作っています。固定のQ&しかし、私は彼らが質問を変更したり追加したりする必要があると確信しています。Djangoでカスタマイズ可能なユーザーアンケートを作成する方法

私は、ユーザーが定義したカスタムの質問で構成されるカスタム評価スキーマを作成できるシステムを作りたいと考えています。このようなデザインを作るにはどうすればいいですか?

今の私のモデルは、このですが、間違っている:

RATING_CHOICES = ((0, u"Good"), (1, u"Bad"), (2, u"Dunno"),) 

class EvaluationScheme(models.Model): 
    title = models.CharField(max_length=200) 

class Evaluation(models.Model): 
    doctor = models.CharField(max_length=200) 
    agency = models.CharField(max_length=200) 
    scheme = models.ForeignKey(EvaluationScheme) 

class EvaluationQuestion(models.Model): 
    question = models.CharField(max_length=200) 
    evaluation = models.ForeignKey(EvaluationScheme) 

    def __unicode__(self): 
     return self.question 

class EvaluationAnswer(models.Model): 
    evaluation = models.ForeignKey(Evaluation) 
    question = models.ForeignKey(EvaluationQuestion) 
    answer = models.SmallIntegerField(choices=RATING_CHOICES) 

あなたはまだすべての質問を選択することがあり、自分自身に答えるため、これは、EvaluationSchemeは無用であることを除いて、私が欲しいものの一種である - それはありません選択したスキーマに関連する質問のみのリストを表示しません。

答えて

5

あなたのモデルは問題ないと思います。私はDjangoの管理者を使ってEvaluationQuestionsでEvaluationSchemeを作成した後、評価を作成し、その質問に答えることができました。ここで私はあなたのモデルに行くために使用されるコードは次のとおりです。

# forms.py: 
from django.forms.models import inlineformset_factory 
import models 

AnswerFormSet = inlineformset_factory(models.Evaluation, 
     models.EvaluationAnswer, exclude=('question',), 
     extra=0, can_delete=False) 

# views.py 
from django.http import HttpResponse 
from django.shortcuts import render_to_response, get_object_or_404 
import models, forms 

def prepare_blank_answers(evaluation): 
    for question in evaluation.scheme.evaluationquestion_set.all(): 
     answer = models.EvaluationAnswer(evaluation=evaluation, 
             question=question) 
     answer.save() 

def answer_form(request, id): 
    evaluation = get_object_or_404(models.Evaluation, id=id) 
    if len(evaluation.evaluationanswer_set.all()) == 0: 
     prepare_blank_answers(evaluation) 
    if request.method == 'POST': 
     formset = forms.AnswerFormSet(request.POST, instance=evaluation) 
     if formset.is_valid(): 
      formset.save() 
      return HttpResponse('Thank you!') 
    else: 
     formset = forms.AnswerFormSet(instance=evaluation) 
    return render_to_response('answer_form.html', 
      {'formset':formset, 'evaluation':evaluation}) 


# answer_form.html: 
<html><head></head><body> 
    Doctor: {{ evaluation.doctor }} <br> 
    Agency: {{ evaluation.agency }} 
    <form method="POST"> 
    {{ formset.management_form }} 
    <table> 
     {% for form in formset.forms %} 
     <tr><th colspan="2">{{ form.instance.question }}</th></tr> 
     {{ form }} 
     {% endfor %} 
    </table> 
    <input type="submit"> 
    </form> 
</body></html> 
+0

あなたの貢献に感謝いたします。しかし、問題は複数のEvaluationSchemeを追加するときです。作成されたスキームに関連する質問だけでなく、すべての質問に答えることができます。 少なくとも管理インタフェースを使用しているときの問題です。しかし、多分私はそれらのフォームでAJAXをやる必要があります。 –

+0

ここで自分のコードを使用する場合は、そのような問題はありません。私のコードのキーラインは、この評価のためのスキームに関連する質問だけをつかむ "evaluation.scheme.evaluationquestion_set.all()の質問"です。コードにそのような行がない場合は、報告した問題が発生します。 – krubo

1

ないDjangoの専門家あなたは答えることをより多くの経験者を待つことを望むかもしれませんが、あなたのような何かを試すことができるように:

EvaluationQuestions.objects.filter(evaluationscheme__title="myscheme").select_related() 

も他の方法で回避の関係を入れて、あなたがする必要がどのように依存してもらえデータにアクセスします。

class EvaluationScheme(models.Model): 
    title = models.CharField(max_length=200) 
    evaluations = models.ManyToMany(Evaluation) 
    questions = models.ManyToMany(EvaluationQuestions) 
3

Django-crowdsourcingは積極的に2012年のとして維持とDjango 1.2+をターゲットにしているジャンゴ - 調査のフォークです。

関連する問題