如何在 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 %}
我对编程还很陌生,我正在尝试建立我的第一个网站!
我正在尝试在服务器端验证表单的某些字段,但我不明白为什么它没有在 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 %}