如何在Django表单中执行自定义错误消息

2024-10-02 20:37:54 发布

您现在位置:Python中文网/ 问答频道 /正文

我想为InstellingInfo表单生成自定义错误消息,但无论我做什么,我都会不断获得浏览器的标准错误消息。应显示的错误消息可以在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'}))

instellingendabase.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>

enter image description here

enter image description here


Tags: forminputrequestcontainerhtmlrequiredformserror
1条回答
网友
1楼 · 发布于 2024-10-02 20:37:54

您可以将novalidate设置为窗体并跳过默认浏览器验证。如果您希望在发送表单之前在浏览器中进行自定义验证,则必须使用JS实现

您可以也应该使用后端(在服务器上的Django中)验证,然后可以显示如下错误:

{{ formulier.naam.error }}

有关如何显示后端验证错误的详细信息,请参见https://docs.djangoproject.com/en/3.2/topics/forms/#rendering-fields-manually

相关问题 更多 >