如何在 Django 表单中引发 ValidationError?

How can I raise ValidationError using DjangoForm?

我对编程还很陌生,我正在尝试建立我的第一个网站!
我正在尝试在服务器端验证表单的某些字段,但我不明白为什么它没有在 HTML 页面上显示给用户。我尝试了不同的方法,但没有成功。我知道这是个新手问题,但我不明白为什么它不起作用。

forms.py
class SuggestionForm(forms.Form):
    name = forms.CharField(max_length=30)
    last_name = forms.CharField(max_length=30)
    text = forms.CharField(max_length=800, widget=forms.Textarea)


    def clean_text(self):
        data = self.cleaned_data['text']
        print(data)
        if len(data) < 50:
            raise forms.ValidationError('The text cannot be smaller than 50 char')
        return data

views.py

def suggestion_add(request):
    if request.method == "POST":
        form = SuggestionForm(request.POST)
        if form.is_valid():
            suggestion = Suggestions.objects.create(
                name = form.cleaned_data['name'],
                last_name = form.cleaned_data['last_name'],
                text = form.cleaned_data['text']
            )
            suggestion.save()
            return redirect("success")
    else:
        form = SuggestionForm()
        form.fields['name'].widget.attrs.update({
                    'placeholder': 'Your name'
                })
        form.fields['last_name'].widget.attrs.update({
                    'placeholder': 'Your surname'
                })
        form.fields['text'].widget.attrs.update({
                    'placeholder': 'Your thoughts'
                })

    return render(request, "suggestions_add.html", {'form':form})

html

<form action="" enctype="multipart/form-data" method="post">
                <div id='id_name' class="control-group">
                    <label for="id_name" class="control-label">
                        Name
                    </label>
                    <div class="controls">
                        {{ form.name }}
                    </div>
                </div>
                <div id='id_prenume' class="control-group">
                    <label for="id_prenume" class="control-label">
                        Last name
                    </label>
                    <div class="controls">
                        {{ form.last_name }}
                    </div>
                </div>
                <div id='id_text' class="control-group">
                    <label for="id_text" class="control-label">
                        Text
                    </label>
                    <div class="controls">
                        <label for="field"></label>
                        {{ form.text }}
                    </div>
                    <div class="characters">
                        <span id="charNum"> </span> <span id="charText"></span>
                    </div>
                </div>
                <div class="wrap-send">
                    <input type="submit" value="Send" class="drpbtn" id="send-sugestion">
                </div>
                {% csrf_token %}
            </form>

我尝试了我在互联网上找到的所有方法,我的代码肯定有问题,因为我不明白为什么它没有向用户显示错误!

非常感谢您的宝贵时间!

因为你没有渲染任何错误。为了呈现任何错误,您不仅应该呈现字段,还应该呈现错误。这在 rendering fields manually section of the documentation 中进行了讨论。例如,对于您的文本字段,您可以使用以下方式呈现错误:

{% if <b>form.text.errors</b> %}
    <ol>
    {% for <b>error in form.text.errors</b> %}
        <li><strong>{{ error|escape }}</strong></li>
    {% endfor %}
    </ol>
{% endif %}
<div class="controls">
    <label for="field"></label>
    {{ form.text }}
</div>

您当然可以添加不同的样式等。

您应该对 所有 表单字段执行此操作,因为每个字段都可能引发错误。

此外还可能存在非字段错误:这些错误与特定字段无关,但通常是字段的组合。这些通常呈现在表单的顶部,类似于:

{% if form<b>.non_field_errors</b> %}
    <ol>
    {% for error in form<b>.non_field_errors</b> %}
        <li><strong>{{ error|escape }}</strong></li>
    {% endfor %}
    </ol>
{% endif %}