#python #html #django #django-views #django-forms
Вопрос:
Я хочу создавать пользовательские сообщения об ошибках для своей формы InstellingenForm, но что бы я ни делал, я продолжаю получать стандартные сообщения об ошибках браузера. Сообщения об ошибках, которые должны отображаться, можно увидеть в choicefield_errors и charfield_errors. Я что-то упускаю, потому что чувствую, что это должно сработать.
Я хочу, чтобы сообщения об ошибках отображались красным цветом над соответствующим полем ввода, прямо рядом с меткой.
В нижней части страницы я поместил несколько фотографий того, как это выглядит сейчас.
views.py:
def instellingenDatabase(request):
if request.method == "POST":
form = InstellingenForm(request.POST)
if form.is_valid():
request.session['data'] = request.POST
spelmodus = request.POST.get('spelmodus')
if spelmodus == 'woorden':
return redirect('speelscherm-woorden')
else:
return redirect('speelscherm-tijd')
else:
form = InstellingenForm()
return render(request, 'instellingenDatabase.html', {'formulier': form})
forms.py:
from django import forms
SPELMODUS = [
('', ''),
('tijd', 'Tijd'),
('woorden', 'Woorden'),
]
TIJD = [
('', ''),
('60', '1 minuut'),
('120', '2 minuten'),
('300', '5 minuten'),
]
WOORDEN = [
('', ''),
('50', '50 woorden'),
('100', '100 woorden'),
('150', '150 woorden'),
]
TALEN = [
('', ''),
('nederlands', 'Nederlands'),
('engels', 'Engels'),
]
MOEILIJKHEID = [
('', ''),
('makkelijk', 'Makkelijk'),
('gemiddeld', 'Gemiddeld'),
('moeilijk', 'Moeilijk'),
]
charfield_errors = {
'required': 'Dit veld is verplicht en mag alleen letters bevatten',
'invalid': 'Dit veld is verplicht'
}
choicefield_errors = {
'required': 'Dit veld is verplicht',
'invalid': 'Dit veld is verplicht'
}
class InstellingenForm(forms.Form):
naam = forms.CharField(label="Naam",
max_length=10,
required=True,
error_messages=charfield_errors,
widget=forms.TextInput(
attrs={'class': 'input-container'}))
spelmodus = forms.ChoiceField(label="Spelmodus",
choices=SPELMODUS,
required=True,
error_messages=choicefield_errors,
widget=forms.Select(
attrs={'class': 'input-container', 'id': 'spelmodus', 'onchange': 'hideShow(this.value)', }))
tijd = forms.ChoiceField(label="",
choices=TIJD,
required=False,
error_messages=choicefield_errors,
widget=forms.Select(
attrs={'class': 'input-container', 'id': 'tijdClass'}))
woorden = forms.ChoiceField(label="",
choices=WOORDEN,
required=False,
error_messages=choicefield_errors,
widget=forms.Select(
attrs={'class': 'input-container', 'id': 'woordenClass'}))
taal = forms.ChoiceField(label="Taal",
choices=TALEN,
required=True,
error_messages=choicefield_errors,
widget=forms.Select(
attrs={'class': 'input-container'}))
moeilijkheid = forms.ChoiceField(label="Moeilijkheid",
choices=MOEILIJKHEID,
required=True,
error_messages=choicefield_errors,
widget=forms.Select(
attrs={'class': 'input-container'}))
instellingenDatabase.html:
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Title</title>
{% load static %}
<link rel="stylesheet" type="text/css" href="{% static 'instellingen.css' %}">
<script type='text/javascript' src="{% static 'instellingen.js' %}"></script>
</head>
<body>
{% include "header.html" %}
<div class="bodypage">
<div class="settings-container">
<div class="playText">
Play
</div>
<form method="POST" action="">
{% csrf_token %}
<label>Naam</label>
{{formulier.naam}}
<label>Spelmodus</label>
{{formulier.spelmodus}}
<label id='tijdlabel' style="display: none;">Tijd</label>
{{formulier.tijd}}
<label id='woordenlabel' style="display: none;">Woorden</label>
{{formulier.woorden}}
<label>Taal</label>
{{formulier.taal}}
<label>Moeilijkheid</label>
{{formulier.moeilijkheid}}
<input type="submit" name="Start" value="Start" class="button">
</form>
</div>
</div>
</body>
</html>
Ответ №1:
Вы можете настроить novalidate
форму и пропустить проверки браузера по умолчанию. Если вы хотите пользовательскую проверку в браузере перед отправкой формы, вы должны реализовать ее с помощью JS.
Вы можете и должны также использовать бэкэнд(в Django на сервере) проверки, а затем вы можете показать ошибку, подобную этой:
{{ formulier.naam.error }}
Более подробная информация о том, как показывать ошибки внутренней проверки, находится здесь https://docs.djangoproject.com/en/3.2/topics/forms/#rendering-fields-manually