【发布时间】:2020-02-11 09:55:13
【问题描述】:
我是 Django 的初学者,最近学习了表单验证。我实现了代码,但无法针对某些约束引发 ValidationError。
这是我后续的文件内容。
forms.py
from django import forms
from django.core import validators
class formClass(forms.Form):
name = forms.CharField(max_length=128)
email = forms.EmailField(max_length=256)
text = forms.CharField(widget=forms.Textarea)
catchBot = forms.CharField(required=False, widget=forms.HiddenInput,
validators=[validators.MaxLengthValidator(0)])
def clean(self):
cleaned_data = super(formClass, self).clean()
t = self.cleaned_data.get('name')
if t[0].lower() != 'd':
raise forms.ValidationError('Name must start with d.')
return cleaned_data
views.py
from django.shortcuts import render
from formApp import forms
from django.http import HttpResponseRedirect
def formNameView(request):
formObj = forms.formClass()
formDict = {'form': formObj}
if request.method == 'POST':
formObj = forms.formClass(request.POST)
if formObj.is_valid():
# SOME CODE
print("NAME: " + formObj.cleaned_data['name'])
print("EMAIL: " + formObj.cleaned_data['email'])
return HttpResponseRedirect('/users')
return render(request, 'formApp/forms.html', context=formDict)
我的有效输入效果很好,但我的无效输入不会发生这种情况。
例如:如果name = 'Alex',它应该引发错误。但事实并非如此。
有人可以帮我吗?
编辑:
[添加了 forms.html 和可调用的验证器。]
以前,我使用validators callable 来引发ValidationError 而不是clean() 方法。但结果是一样的。
这是我的代码:
def checkForD(value):
if value[0].lower() != 'd':
raise forms.ValidationError('Name must start with d.')
.
.
.
# in my formClass()
name = forms.CharField(max_length=128, validators[checkForD])
...
Forms.html
<body>
<div class='container'>
<div class='jumbotron'>
<h3>Welcome to the form page.</h3>
<h2>Please insert the form.</h2>
</div>
<form method="post">
{{form.as_p}}
{% csrf_token %}
<input type="submit" value="Submit" class="btn btn-primary"/>
</form>
</div>
</body>
【问题讨论】:
-
会发生什么?它仍然打印姓名和电子邮件吗?
-
@DanielRoseman 是的,它在控制台上运行,但仅用于有效输入。该代码运行良好,但它没有在我的网页上显示 ValidationError。只是为了确认,我使用了验证器而不是 clean 方法,但问题仍然存在。
-
@DanielRoseman 为方便起见,我正在上传我的网页模板。我认为它没有任何用处,但我仍然应该向您提供我的方法。
标签: django python-3.x django-forms