如何在GET或POST中多次使用Django表单字段

时间:2012-10-01 15:51:40

标签: python django django-forms django-templates

这就是我所拥有的,一个简单的Django表单

class survey (forms.Form):
    answer = forms.ChoiceField(
                                 widget = RadioSelect(),
                                 choices = answers_select
                                )

现在,在我的HTML页面上,我不只是一个问题,而是许多问题!是否可以将上述answer字段用于所有问题?对于所有问题,我必须展示相同的选择!

说我有3个问题:

  1. 我的餐厅怎么样?
  2. 食物怎么样
  3. 服务如何
  4. 以上answer字段的选择为1. good, 2. bad 3. worst 所以,我不想为3个问题创建3个表单字段作为其冗余

2 个答案:

答案 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)

在链接文档中对此进行了全面的描述。