0

そこで、クイズを構成するこれらのモデルQuestionAnswer、およびを用意しました。UserAnswer私が直面している問題は、これらのモデルで検証されるフォームを作成することです。私はそれを行う方法のアイデアを持っていますが、うまくいきません。

class QAForm(forms.Form):
    answers = forms.ChoiceField(label='Question is this', choices=[('Answer1','Answer1'),('Answer2','Answer2')], widget=forms.RadioSelect())

これは、数千ではなく、1 つのフォームに対して機能します。ユーザーが生成したすべての質問と回答をフォームとして表示し、独自の回答を提供できるようにするには、このコードをどのように変更すればよいでしょうか。

私はこれを持っています(動作しますが、良い習慣ではないことはわかっています):

def questions(request):
    queryset = Questions.objects.all()
    if request.method =='POST':
        a = request.POST['answer']
        answer = Answer.objects.get(answer=a)
        importance = request.POST['importance']
        q = request.POST['question']
        question = Questions.objects.get(id=q)
        try:
            user_answer = UserAnswers.objects.get(owner=request.user, question=question)
            user_answer.answer = answer
            user_answer.importance = importance
            user_answer.save()
        except:
            user_answer = UserAnswers(owner=request.user, question=question, answer=answer, importance=importance)
            user_answer.save()
    else:
        try:
            current = UserAnswers.objects.all().filter(owner=request.user)
        except:
            current = ''
return render_to_response("questions/base.html", locals(), context_instance=RequestContext(request))

私のモデル:

class Answer(models.Model):
        answer = models.CharField(max_length=120)
        question = models.ForeignKey('Questions', null=True, blank=True)

        def __unicode__(self):
                return self.answer

IMPORTANCE = (
        ('Irrelevant', 'Irrelevant'),
        ('A Little Important', 'A Little Important'),
        ('Somewhat Important', 'Somewhat Important'),
        ('Very Important', 'Very Important'),
        ('Mandatory', 'Mandatory'),
)

class Questions(models.Model):
        owner = models.ForeignKey(User)
        question = models.CharField(max_length=300)
        importance = models.CharField(max_length=120, choices=IMPORTANCE, null=True, blank=True)
        updated = models.DateTimeField(auto_now=False, auto_now_add=True)
        timestamp = models.DateTimeField(auto_now=True)

        def __unicode__(self):
                return self.question

        class Meta:
                verbose_name            ='Question'
                verbose_name_plural     ='Questions'


class UserAnswers(models.Model):
        owner = models.ForeignKey(User)
        question = models.ForeignKey(Questions)
        answer = models.ForeignKey(Answer)
        importance = models.CharField(max_length=120, choices=IMPORTANCE)

        def __unicode__(self):
                return str(self.owner) + " " + str(self.answer) + " " + str(self.importance)
4

2 に答える 2

3

これはどう?(実際にテストしたことはありませんが、機能するはずです)

class QuestionForm(forms.ModelForm):
    answer = forms.ChoiceField(required=True, widget=forms.RadioSelect())

    def __init__(self, question=None, *args, **kwargs):
        super(QuestionForm, self).__init__(*args, **kwargs)
        self.fields['answer'].choices = [(a.text, a.value) for a in Answer.objects.filter(question=question)]

    class Meta:
        model = Question
        fields = ('text')

次に、次のように開始します-

q = Question.objects.get(pk=1)
qform = QuestionForm(instance=q)

これは、1つのフォームだけが必要な場合に実行できます。何千ものFormSetが必要な場合は、 FormSetを使用できます。

PS:AnswerモデルにはQuestionモデルへの外部キーがあり、それらはすでに埋められていると思います。

于 2013-02-17T21:59:57.420 に答える
2

あなたの要求のための最新のコード。このコードを試すことができます:

class QuestionForm(forms.ModelForm):
    answer = forms.ChoiceField(required=True, widget=forms.RadioSelect())

def __init__(self, question=None, *args, **kwargs):
    super(QuestionForm, self).__init__(*args, **kwargs)
    self.fields['answer'].choices = [(a.text, a.value) for a in Answer.objects.filter(question=question)]

class Meta:
    model = Question
    fields = ('text')

一般知識

于 2013-05-26T07:42:17.453 に答える