我有一个简单的表单,每当用户在表单上做错时,我都想在 Django 上引发验证错误。问题是我设置了表单验证,但是当表单以错误的值提交时,它会通过。我想知道为什么会发生这种情况以及如何避免这种情况?
这是html表单:
<form id="ask-project" method="post" action="{% url 'ask-project' %}">
{% csrf_token %}
<input required="required" class="form-control form-text required" id="prenom" name="prenom" type="text">
<button class="btn btn-default submit">Submit</button>
</form>
视图.py:
def askProject(request):
if request.method == 'POST':
form = AskProjectForm(request.POST)
if form.is_valid():
save_it = form.save(commit=False)
save_it.save()
return redirect('/merci/') #success
表格.py:
class AskProjectForm(forms.ModelForm):
class Meta:
model = AskProject
fields = ['prenom']
def clean_prenom(self):
prenom = self.cleaned_data['prenom']
if len(prenom) < 3:
raise ValidationError('Votre prénom doit etre plus long que 1 caractère.')
return prenom
难道我做错了什么?
对于您正在使用的模式,这类问题是不可避免的,也是日常的事情。第一件事是不要像您所做的那样手动呈现表单。这意味着当用户输入无效数据时,您不会显示任何反馈。考虑使用{{ form }}
,{{ form.as_table }}
等,或渲染的所有信息字段说明如下:https://docs.djangoproject.com/en/1.11/topics/forms/#rendering-fields-manually
第二个问题是您在提交表单时重定向,无论它是否有效。推荐的模式是仅在表单有效时重定向。因此,即使您应用了第一段中的建议,您仍然没有得到所需的反馈。考虑实施手册中建议的表格。直接复制过去如下
if request.method == 'POST':
# create a form instance and populate it with data from the request:
form = NameForm(request.POST)
# check whether it's valid:
if form.is_valid():
# process the data in form.cleaned_data as required
# ...
# redirect to a new URL:
return HttpResponseRedirect('/thanks/')
# if a GET (or any other method) we'll create a blank form
else:
form = NameForm()
return render(request, 'name.html', {'form': form})
最后了解为什么您的表单验证不起作用的具体情况,在您的 clean 方法中添加一个打印语句来打印出字符串和它的长度,看看它是否符合(或者您的方法是否被调用)
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句