Django测验 - 用户生成
我有几个模型,分别是 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模型,并且这些数据已经填好了。