我正在尝试使用自定义字段生成一个表单(简而言之:某人回答一系列问题的表单,是测验的一部分。测验问题是使用 Django 管理员管理的,现在我需要一个表单启用提交)。
我知道在模板文件中我应该做一个“for field in form”而不是“for field in form.fields”。
但是,直接遍历表单会返回错误:'WSGIRequest' object has no attribute 'get'。此错误发生在 django 的 data.get() (由 field.widget.value_from_datadict() 调用)函数中,同时尝试渲染{{ field }}。
我知道我正在处理未绑定的字段,但看不到我现在做错了什么。关于这个问题的任何线索?谢谢
在forms.py中
class ResponseSetForm(forms.Form):
def __init__(self, request=None, instance=None, *args, **kwargs):
self.title = "TOTO"
quizz = kwargs.pop('quizz')
super(ResponseSetForm, self).__init__(request, instance, *args, **kwargs)
question_list = quizz.mcquestion_set.all().order_by('position')
fields={}
theChoices=quizz.rating_scale.mcqrating_set.all().order_by('value')
choices = ((x.value, x.label) for x in theChoices)
for question in question_list:
fieldname = 'question_%s' % question.identifier
widget = RadioSelect()
self.fields[fieldname] = forms.TypedChoiceField(coerce=int, empty_value=None, required=True, label=question.text, choices=choices, widget=widget)
在views.py中
class QuizzView(FormView):
http_method_names = ['get', 'post']
template_name = 'test.html'
form_class = ResponseSetForm
success_url = "/"
def get_form_kwargs(self, *args, **kwargs):
#used by the form
kwargs = super(QuizzView, self).get_form_kwargs()
kwargs.update({
'request' : self.request,
'quizz' : self.quizz
})
return kwargs
def dispatch(self, request=None, *args, **kwargs):
# parse the request here ie.
self.request = request
self.quizz = Quizz.objects.prefetch_related('rating_scale', 'mcquestion_set').get(pk=kwargs['pk'])
# call the view
return super(QuizzView, self).dispatch(request, *args, **kwargs)
在 test.html 模板文件中:
{% if quizz %}
<form action="/mcq/2/" method="post">{% csrf_token %}
<h2>{{ form.title }}
<table>
{% for field in form %}
<tr>
<td>{{ field.label }}</td>
<td>{{ field }}</td>
</tr>
{% endfor %}
</table>
<p><input type="submit" value="Submit" /></p>
</form>
{% else %}
<p>No questions are available.</p>
{% endif %}
网址模式是:
url(r'^(?P<pk>\d+)', QuizzView.as_view(), name='run_quizz')