Ошибка "This field is required" для FormSet при запросе полезной нагрузки, но работает нормально с Form
Edit: Похоже, я понял следующий шаг в исправлении этого, так как фактическое имя каждой переменной в полезной нагрузке должно быть таким, каким я задал его в формах. Я обновлю информацию, если решу эту проблему.
Нужна помощь в решении этой проблемы. Если я передаю набор форм в 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
Для этого в голову пришли два способа.
- Переключите
form.CharField
наform.ChoiceField
# 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))
- Поле формы, необходимое для
False
, проверьте этот вопрос