【问题标题】:Django - Multiple instances of same form class in one viewDjango - 一个视图中相同表单类的多个实例
【发布时间】:2018-12-04 16:44:58
【问题描述】:

在 Django Forms 的上下文中,我看到很多关于在同一页面上处理不同类型的 forms 的讨论(例如同一页面上的 AFormBForm),但我正在尝试了解如何在一个页面上处理同一 form 类的多个实例。

我可以正常显示表单,但是当表单为POSTed 时我不知道如何处理它们。

我也尝试过使用Formsets,并且遇到了同样的问题(可以显示,但不知道如何处理POST)。

所以这是我的问题:假设我在一个页面上显示 same Form 类的几个实例。提交这些表单时,我将如何处理POST 数据?

编辑:

formset 的问题是我有一个自定义表单,并且发现很难使用formset 处理POST 数据。

编辑 2 - 根据@neverwalkaloner 的回复提供更多详细信息。

这是我的表单类:

class QuestionForm(forms.Form):
def __init__(self, question, data=None, *args, **kwargs):
    super(QuestionForm, self).__init__(*args, **kwargs)
    choice_list = [x for x in question.get_answers_list()]
    self.fields['answers'] = forms.ChoiceField(choices=choice_list,
                                            widget=RadioSelect)

    self.fields['answers'].label = question.content

我正在创建不同的表单,前缀如下:form = QuestionForm(question=question, prefix=prefix)

然后,像这样处理 POST 数据:form = QuestionForm(data=request.POST, question=question, prefix=prefix)

但是,表单不与上述方法绑定:(

【问题讨论】:

    标签: python django forms post django-forms


    【解决方案1】:

    您可以使用prefix 参数来初始化视图中的多个表单:

    mother = PersonForm(request.POST, prefix="mother")
    father = PersonForm(request.POST, prefix="father")
    
    return render(request, 'some_template.html', {
        'mother': mother,
        'father': father,
    })
    

    【讨论】:

    • 感谢您的回复!这正是我的想法,但我无法让表单与这种方法绑定。我将添加更多关于我的Form 和问题中的绑定逻辑的详细信息,如果您能提供一些反馈,那就太好了。
    • @John PersonForm(request.POST, prefix="mother") 应该可以正常工作。如何在模板中呈现表单?
    • 这是来自模板的渲染代码。我还在 OP 中添加了有关 Form 子类的更多详细信息 questions 是表单列表:{% for question in questions %} <tr><td> {{ question.as_p }} </td></tr> {% endfor %}
    • @John 表单__init__ 中的一条小评论我想应该是super(QuestionForm, self).__init__(data, *args, **kwargs)。您错过了数据参数。
    • 啊,你是救命稻草 :) 绑定现在按预期工作 - 谢谢!
    猜你喜欢
    • 2016-08-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-07-25
    • 1970-01-01
    • 2016-03-22
    • 2017-02-26
    • 1970-01-01
    相关资源
    最近更新 更多