【问题标题】:Django forms. Fields with the same html name attributeDjango 表单。具有相同 html 名称属性的字段
【发布时间】:2016-06-02 10:19:47
【问题描述】:

我在使用 django 表单时遇到问题。 我目前正在使用 request.POST 来验证视图中的 POST。 我想通过将整个过程移至表单来稍微解耦。

我想做什么:
向用户呈现 5 个输入文本。他可以使用 javascript 添加多达 30 条文本。 每个输入文本都有 name='choices[]' 属性。所以当我得到 request.POST 字典时,我只是这样做:

choices = request.POST.getlist('choices[]') 

我得到所有用户的选择。

这如何用 django 表单实现?
比如下面的表格:

class MyForm(forms.Form):

    # Form fields
    title = forms.CharField()
    choice1 = forms.CharField()
    choice2 = forms.CharField()
    option = forms.ChoiceField(choices=(...))

会在 HTML 中产生类似这样的内容:

<input name="title" type="text" />   
<input name="choice1" type="text" />
<input name="choice2" type="text" />
<select name="option">
    <option .... />
       ....
</select>

是否可以在不自己手动将其硬编码到 HTML 文件中的情况下使其生成以下内容?:

<input name="title" type="text" />   
<input name="choices[]" type="text" />
<input name="choices[]" type="text" />
<select name="option">
    <option .... />
       ....
</select>

如果是,之后我该如何处理验证?

谢谢

P.S 我阅读了有关 django 表单集的文档,但这是关于创建多个表单,而不是 1 个表单,所以我认为它没有任何用处。

【问题讨论】:

  • 再次阅读formset 文档。这就是你需要的。 Formset 是一组forms,而不仅仅是一个form
  • 嗯,好的,我避免提及整个表单包含更多元素,而不仅仅是选择。如果我提供一个 extra=3,它将提供 3 个额外的表单,而我只需要 3 个额外的选择字段。我错过了什么吗?这也解决了名称问题吗?
  • 你可以把问题分成几部分,一一解决(分而治之),看我的回答。

标签: django django-forms forms


【解决方案1】:

您可以将常规 form 用于 fields 的其余部分,将 formset 用于 choices

#in your forms.py
from django import forms
class MyMainForm(forms.Form):
    title = forms.CharField()

class MyChoicesForm(forms.Form):
    choice = forms.CharField()

MyChoicesFormset = forms.formset_factory(MyChoicesForm)

#in your views.py
def my_manage_view(request):
    if request.method == 'POST':
        form = MyMainForm(request.POST)
        formset = MyChoicesForm(request.POST)
        if form.is_valid() and formset.is_valid():
            # do something with the form and formset.cleaned_data
            pass
    else:
        form = MyMainForm()
        formset = MyChoicesForm()
    return render(request, 'my_manage_view.html', {
        'form': form,
        'formset': formset
    })


#in your template you can render them inside one <form> tag
<form method="post" action="">
    {{ form }}
    <table>
        {{ formset }}
    </table>
</form>

【讨论】:

    猜你喜欢
    • 2011-01-13
    • 2018-06-26
    • 2017-11-06
    • 2023-03-25
    • 2017-03-03
    • 1970-01-01
    • 2015-12-27
    • 2011-01-18
    • 1970-01-01
    相关资源
    最近更新 更多