Как создавать пользовательские сообщения об ошибках в формах Django

#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