Форма с полем ModelChoiceField(required=True) не вызывает ошибку ValidationError, если ни один вариант не выбран
У меня есть форма, которая выдает ValidationErrors для всех полей, если они не действительны. Однако, если не выбран ни один вариант из ModelChoiceField, форма не отправляется (что нормально) и не вызывает никаких ValidationError в шаблоне
# Form
class PollersForm(forms.Form):
# Poller Category
poller_category = forms.ModelChoiceField(widget=forms.RadioSelect(attrs={
'class': 'poller-category-radio',
}), queryset=Category.objects.all().order_by('category'), label='Select a Category', required=True)
[..|
# View
def raise_poller(request):
# check whether it's valid:
if form.is_valid():
# process the remaining data in form.cleaned_data as required
poller_text = form.cleaned_data['poller_text']
poller_category = form.cleaned_data['poller_category']
# passes all the time even if no choice is selected
# Template
<form action="/raisepoller/" method="post">
{% csrf_token %}
{{ form.non_field_errors }}
{{ form.errors }}
[..]
<!-- Poller Categories -->
<div class="fieldWrapper">
<div class="label">{{ form.poller_category.label_tag }}</div>
<div class="category-ctn">
{% for category in form.poller_category %}
<div class="category-wrapper">{{ category }}</div>
{% endfor %}
</div>
</div>
<!-- Submit Button -->
<button type="submit" value="Publish Poller" id="raise-poller-button">
<div class="button-wrapper">
<div class="button-icon"><img id="button-image" src="{% static 'images/send.png' %}"></div>
<div class="button-text">Publish Poller</div>
</div>
</button>
</form>
required = true
проверяет только наличие чего-либо в поле
.
этим
можете ли вы проверить в данных ответа, есть ли значение по умолчанию для этого поля?
Похоже, что
if request.method == 'POST':
возвращаетFalse
, если при отправке не выбрана категория.
Браузер даже не отправляет запрос, потому что проверка HTML5 не прошла.
Сообщение о проверке не отображается из-за visibility: hidden
на input
.
.category-wrapper input {
position: fixed;
visibility: hidden;
}
... что вызывает эту ошибку, показанную в консоли браузера:
❗Некорректный элемент управления формы с name='category' не фокусируется.
Вместо этого сделайте его прозрачным, без ширины и полей:
.category-wrapper input {
margin: 0;
opacity: 0;
width: 0;
}
Это происходит потому, что представление проходит мимо первого if
if request.method == 'POST':
создайте форму
# create a form instance and populate it with data from the request:
form = PollersForm(request.POST)
тогда проверьте, является ли он действительным
# check whether it's valid:
if form.is_valid():
поскольку он не валиден, представление возвращается к первому отступу и рендерит шаблон с формой, внутри которой находится ошибка.
else:
form = PollersForm()
return render(request, 'pollinator/raise_poller.html', {'form': form})
лучшее, что вы можете сделать, это вынести чистую форму request.method из else
form = PollersForm()
return render(request, 'pollinator/raise_poller.html', {'form': form})