首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何在Django表单中自定义错误消息

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

Stack Overflow用户
提问于 2021-05-12 21:00:44
回答 1查看 153关注 0票数 0

我想为我的InstellingenForm定制错误消息,但无论我做什么,我都会得到浏览器的标准错误消息。在choicefield_errors和charfield_errors中可以看到应该显示的错误消息。我是不是错过了什么,因为我觉得它应该是有效的。

我希望错误消息以红色显示在相关输入字段的上方,紧挨着标签。

在页面的底部,我放了几张它现在的样子的图片。

views.py:

代码语言:javascript
复制
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:

代码语言:javascript
复制
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:

代码语言:javascript
复制
<!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>

EN

回答 1

Stack Overflow用户

发布于 2021-05-12 21:11:35

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

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

代码语言:javascript
复制
{{ formulier.naam.error }}

有关如何显示后端验证错误的更多信息,请单击此处https://docs.djangoproject.com/en/3.2/topics/forms/#rendering-fields-manually

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/67504197

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档