Django测验 - 用户生成

0 投票
2 回答
848 浏览
提问于 2025-04-17 16:05

我有几个模型,分别是 Question(问题)、Answer(答案)和 UserAnswer(用户答案),它们一起构成了一个测验。现在我遇到的问题是,如何创建一个表单来验证这些模型。我对怎么做有个想法,但目前还不太管用。

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

这个方法适合一个表单,但如果有成千上万个表单就不行了。我该怎么修改这段代码,让用户能看到所有用户生成的问题和答案,并且可以给出自己的答案呢?

我有这个(虽然能用,但我知道这不是个好做法):

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)

2 个回答

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')

通用知识

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)

如果你只需要一个表单,这样做就可以了。如果你想要成千上万个表单,可以使用FormSet

另外,我假设Answer模型里有一个外键指向Question模型,并且这些数据已经填好了。

撰写回答