【问题标题】:How to do custom error messages in Django Forms如何在 Django 表单中自定义错误消息
【发布时间】:2021-05-12 13:00:44
【问题描述】:

我想为我的 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>

【问题讨论】:

    标签: python html django django-views django-forms


    【解决方案1】:

    您可以设置novalidate 以形成和跳过默认浏览器验证。如果你想在发送表单之前在浏览器中进行自定义验证,你必须使用 JS 来实现它。

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

    {{ formulier.naam.error }}
    

    更多关于如何显示后端验证错误的信息在这里https://docs.djangoproject.com/en/3.2/topics/forms/#rendering-fields-manually

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2014-07-14
      • 2015-08-13
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多