Python Django测验-用户生成
所以我有这些模型,它们组成了一个测验。我面临的问题是制作一个表单来验证这些模型。我知道怎么做,但没用Python Django测验-用户生成,python,django,Python,Django,所以我有这些模型,它们组成了一个测验。我面临的问题是制作一个表单来验证这些模型。我知道怎么做,但没用 class QAForm(forms.Form): answers = forms.ChoiceField(label='Question is this', choices=[('Answer1','Answer1'),('Answer2','Answer2')], widget=forms.RadioSelect()) 这适用于1种形式,而不是数千种形式。我将如何修改此代码,以便用
class QAForm(forms.Form):
answers = forms.ChoiceField(label='Question is this', choices=[('Answer1','Answer1'),('Answer2','Answer2')], widget=forms.RadioSelect())
这适用于1种形式,而不是数千种形式。我将如何修改此代码,以便用户将所有用户生成的问题和答案视为表单,并可以提供自己的答案
我有这样一个方法(它有效,但我知道这不是一个好的做法):
我的模型:
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)
这个怎么样?(还没有实际测试过,但应该可以正常工作)
然后像这样启动它-
q = Question.objects.get(pk=1)
qform = QuestionForm(instance=q)
当您只需要一个表单时,可以执行此操作。如果你想要上千个,你可以用一个
附言:我假设答案模型有一个问题模型的外键,它们已经被填满了。这个怎么样?(还没有实际测试过,但应该可以正常工作)
然后像这样启动它-
q = Question.objects.get(pk=1)
qform = QuestionForm(instance=q)
当您只需要一个表单时,可以执行此操作。如果你想要上千个,你可以用一个
PS:我假设答案模型有一个问题模型的外键,它们已经被填满了。最新的代码满足您的需求。您可以尝试以下代码:
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')
符合您需求的最新代码。您可以尝试以下代码:
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')
@arulmr刚刚添加了我的视图,向您展示了我当前的工作方式。用户生成的部件工作正常。表单的呈现不正常。您根本没有验证表单。看看这个例子。如果您需要数千张相同的表格,请查看Formset-out。如果您想从模型生成表单,请检查ModelForm。@Bibhas是的,我意识到表单没有验证。您将如何实现问答表单?这样就有了两个独立的模型?@arulmr刚刚添加了我的视图,向您展示了我当前的工作方式。用户生成的部分工作正常。表单的呈现不正常。您根本没有验证表单。看看这个例子。如果您需要数千张相同的表格,请查看Formset-out。如果您想从模型生成表单,请检查ModelForm。@Bibhas是的,我意识到表单没有验证。您将如何实现问答表单?这样就有两个不同的模型了?哥们!这很有效。谢谢。我现在的问题是,它显示了答案模型中的所有对象(而不是关联的对象)。我将更新原始问题以包括我的模型。TBH:答案不需要多个关系。答案已经与多对一关系中的Foreignkey问题相关。删除行
answers=models.ManyToManyField(Answer)
,检查答案的foreignkey字段的值。哦,是的,谢谢。我已经玩了一段时间,以获得预期的结果。它现在运行良好,除了调用表单。清除的数据['answer']
返回所有应答实例,而不是所选实例。(同样的情况也发生在request.POST['answer']
)你的关系一团糟。清理干净,伙计!这很有效。谢谢。我现在的问题是,它显示了答案模型中的所有对象(而不是关联的对象)。我将更新原始问题以包括我的模型。TBH:答案不需要多个关系。答案已经与多对一关系中的Foreignkey问题相关。删除行answers=models.ManyToManyField(Answer)
,检查答案的foreignkey字段的值。哦,是的,谢谢。我已经玩了一段时间,以获得预期的结果。它现在运行良好,除了调用表单。清除的数据['answer']
返回所有应答实例,而不是所选实例。(同样的情况也发生在request.POST['answer']
)你的关系一团糟。把它清理干净。