繁体   English   中英

请求有效负载时 FormSet 出现“此字段是必需的”错误,但适用于 Form

[英]"This field is required" error for FormSet when requesting payload, but works fine with Form

编辑:我似乎已经想出了解决这个问题的下一步,因为有效负载中每个变量的实际名称需要是我在表单中设置它的方式。 如果我解决它会更新。 此外,如果我将其更改为 GET 请求,它可以正常工作,但我不知道为什么 Django 不能处理 POST 请求。

需要一些帮助。 如果我将表单集传递给 html 模板并使用 POST 请求请求其有效负载,我会收到此错误

Field Error: primary <ul class="errorlist"><li>This field is required.</li></ul> Field Error: symbol <ul class="errorlist"><li>This field is required.</li></ul> Field Error: secondary <ul class="errorlist"><li>This field is required.</li></ul>

对于表单集,表单是动态添加或删除到页面上的,但页面加载时页面上始终只有一个表单。 对于其他动态添加的表单,它们也会出现相同的错误。 但是当我将单个表单传递给 html 模板时,我得到的 POST 有效负载就很好了。

views.py

def advanced(request):

    form = formset_factory(Search)
    if request.method == 'POST':
        formset = Search(request.POST)
        for field in formset:
            print("Field Error:", field.name,  field.errors)
    return render(request,"advancedsearch.html", {"formset":form})
forms.py

indicator = [
    ('', ''),
    ('high', 'Estimated high'),
    ('low', 'Estimated low'),
    ('median', 'Estimated median'),
    ('realprice', 'Real Price'),
    ]

symbol= [
    ('', ''),
    ('>', 'higher than'),
    ('<', 'less than'),
    ('=', 'equal to'),
    ]


class Search(forms.Form):
    primary = forms.CharField(label='a', widget=forms.Select(choices=indicator))
    symbol =  forms.CharField(label='b', widget=forms.Select(choices=symbol))
    secondary = forms.CharField(label='c', widget=forms.Select(choices=indicator))
advancedsearch.html

<form method="POST" action="">{% csrf_token %}
  {% for x in formset %}
    <div class = "d-flex flex-row justify-content-center bd-highlight mb-5">
      {{ x.as_p }}
    </div>
  {% endfor %}    
  <button type="submit" class="btn btn-primary" >Search</button>
</form>
Form Data example
csrfmiddlewaretoken: Sc2bMfDJr2qQ9rqeOxd3YnVpB37d36ZkQ85OfGaUL7vD61IyGzNiVDn6c5vydKSX
form-0-primary: low
form-0-symbol: >
form-0-secondary: low

为此想到了两种方法。

  1. form.ChoiceField切换为form.CharField
# forms.py

...

class Search(forms.Form):
    primary = forms.CharField(label='a', widget=forms.Select(choices=indicator))
    symbol =  forms.CharField(label='b', widget=forms.Select(choices=symbol))
    secondary = forms.CharField(label='c', widget=forms.Select(choices=indicator))
  1. True 表单字段需要False ,检查这个问题

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM