这就是我所拥有的,一个简单的Django表单
class survey (forms.Form):
answer = forms.ChoiceField(
widget = RadioSelect(),
choices = answers_select
)
现在,在我的HTML页面上,我不只是一个问题,而是许多问题!是否可以将上述answer
字段用于所有问题?对于所有问题,我必须展示相同的选择!
说我有3个问题:
以上answer
字段的选择为1. good, 2. bad 3. worst
所以,我不想为3个问题创建3个表单字段作为其冗余
答案 0 :(得分:2)
退后一步,仔细思考 - 你需要3个ChoiceField
来跟踪3个不同问题的答案,并且无法解决问题。
实际上重复表单字段构建调用是多余的,特别是如果您正在处理20个问题。在这种情况下,您可以将问题列表存储为类不变,而不是静态构造这些字段,并在表单构造过程中动态创建表单字段。
这里有一些内容可以让您初步了解如何进行此操作:
class SurveyForm(forms.Form):
questions = _create_questions('How is my restaurant?',
'How is the Food?',
'How is the service?')
def __init__(self, *args, **kwargs):
# Create the form as usual
super(SurveyForm, self).__init__(*args, **kwargs)
# Add custom form fields dynamically
for question in questions:
self.fields[question[0]] = forms.ChoiceField(label=question[1],
widget=forms.RadioSelect(),
choices=answers_select)
@classmethod
def _create_questions(cls, *questions):
return [(str(index), question) for index, question in enumerate(questions)]
答案 1 :(得分:1)
您正在寻找formsets。你可以这样做:
from django.forms.formsets import formset_factory
SurveyFormSet = formset_factory(survey, extra=3, max_num=3)
将其添加到您的上下文中:
def get_context_data(self, request, *args, **kwargs):
data = super(MyView, self).get_context_data(request, *args, **kwargs)
data['formset'] = SurveyFormSet()
return data
然后在模板中使用它:
<form method="post" action="">
{{ formset.management_form }}
<table>
{% for form in formset %}
{{ form }}
{% endfor %}
</table>
</form>
在帖子中,您需要将request.POST和request.FILES传递给formset构造函数:
formset = SurveyFormSet(request.POST, request.FILES)
在链接文档中对此进行了全面的描述。