问题描述
|
通过查看文档,可以发现form clean()方法仅旨在进行与语法相关的轻量级验证,例如检查电子邮件地址是否以\“。com \”或\“。edu \”结尾,或者确保用户从“选择最喜欢的三个电视节目”列表中选择的项目不超过三个。
我正在开发一个允许用户设置密码的应用程序,我想确保其密码不包含其登录名或真实姓名,并且clean()方法看起来不正确从设计的角度以及从clean()方法无法访问会话数据的实际限制的角度,都可以进行这种检查。
在哪里进行更多重量级验证的最佳位置?如果在调用“ 0”后在视图中进行了一些自定义检查,是否有办法返回到标准格式错误处理?
我有一个想法,代码可能看起来像这样:
def process_login(request):
\"\"\"display or process the login form.\"\"\"
if request.method == \'POST\':
form = LoginForm(request.POST)
if form.is_valid():
password = form.cleaned_data[\'password\']
if password_is_bad(password,request):
# what Now?
解决方法
还有针对特定领域的验证钩子:
clean_$fieldname
。请参阅Django文档这一节中的详细信息。
更新:至于将会话信息传递到表单,这可以通过属性分配轻松完成:
form = LoginForm(request.POST)
form.session = request.session
那么您可以通过clean_password
方法访问self.session
。
, 我更喜欢在表单中进行所有验证。如果我在考虑对象责任方面,我认为表单是描述表单组件以及如何在HTML表单和有效python对象之间进行转换的对象,其中“ valid \”包括应用程序-具体要求。
如果表单需要它通常无法访问的信息,则将该信息传递给表单的构造函数。未经测试的代码如下:
class MyForm(Form):
def __init__(self,session,*args,**kwargs):
self.session = session
super(MyForm,self).__init__(self,**kwargs)
def clean(self):
# does something with self.session
这种方法的优点是可以使您的视图经常变得非常通用,经常达到仅将实例化表单对象传递给自定义通用视图的程度。
, 如果您确实要验证视图中表单的某些部分,则可以引发ValidationError异常,该异常会使用户返回并显示错误消息。
from django.forms.util import ValidationError
if len( form.cleaned_data[\'password\'] ) < 5:
raise ValidationError(\'You have to type at least five characters\')