django 中关于 forms 的问题

2014-07-06 13:37:16 +08:00
rcmerci  rcmerci
比如有如下的代码
def validate_test(value):
if len(value)<10:
raise VaValidationError('wrong')

class TestForm(forms.Form):
content = forms.CharField(max_length=50, validator=[validate_test])
def clean_content(self):
if self.cleaned_data['content']<10:
raise ValidationError('wrong')
return self.cleaned_data['content']
=================================================
那么这里的 validate_test函数 和 clean_content函数 起到的作用是一样的吗?
如果一样的话,那么这两种写法的区别在哪里呢?
谢谢~
============================================
我晕,,为什么缩进没了。。。
===============================
谁能告诉我怎么缩进吗?我编辑的时候是有缩进的呀!
4099 次点击
所在节点   Django  Django
8 条回复
P9
P9
2014-07-06 16:38:54 +08:00
看的好累…
clean_* 函数,应该是一个检查函数的总入口,validate_*是检查某个值用的把
具体还要看django文档
izoab
izoab
2014-07-06 19:05:53 +08:00
缩进问题实在不行就截图吧。

validate_test我貌似没用过这个,好像是用form.valid还是什么的一个方法,我估计是验证输入类型合规性的,比如你的这个字段本来是int,但输入的是str,那他就会告诉你不对。

clean_content是得到干净的数据,比如django会把一些有风险的支付给转义掉。
pythoner
pythoner
2014-07-06 19:19:16 +08:00
clean_*方法用来清理字段用的。把验证的方法写在这里行是行,但是并不提倡这样写
而应该写在validate_*或者 is_valid方法里

让一个函数只做一件特定的事,clean和validate不要混在一起写。
rcmerci
rcmerci
2014-07-06 19:29:49 +08:00
@pythoner 那就是说表单的验证都应该在Field的validator=[validate_test,...],都放在这里面吗?而不是在clean_*里面验证数据正确性?
还有我不太清楚 [clean_*方法用来清理字段用的] 这句话,可以解释一下吗?
谢啦:)
pythoner
pythoner
2014-07-06 19:44:28 +08:00
@rcmerci

我举个例子
比如在form中有一个输入框(forms.CharField())叫做tags,它的value是以半角逗号分开的字符串,像这样:“linux,python,database”,那我可以在clean_tags中将它split一下转成一个list方便我存入数据库中(假如我用mongodb)
如果我要验证tags,不允许里面出现'fuck'这个tag,那我应该在validate_tags中来检查
if 'fuck' in cleaned_form.get('tags',[]):raise ValidationError('Your message here')
rcmerci
rcmerci
2014-07-06 20:02:04 +08:00
@pythoner 谢谢啦,我还有个问题:
比如:validate_test这个函数,可不可以放在一个class TestForm里面作为一个成员函数,还是一定要定义在class外面呢?
no13bus
no13bus
2014-07-06 20:49:34 +08:00
@rcmerci 我觉得看情况吧。比如这个验证是多个form都回用到的,那么就写到外面,如果仅仅是这个form用 就写在form自己的这个class里面
vicalloy
vicalloy
2014-07-06 21:36:41 +08:00
clean_* 里写校验是django推荐的做法。
validator=[validate_test,...]的做法只是在多个字段校验规则一样,为了提交复用性时才会用到。
具体看django官方文档。django的文档写的非常的好。
https://docs.djangoproject.com/en/dev/ref/forms/validation/#cleaning-a-specific-field-attribute

https://docs.djangoproject.com/en/dev/ref/validators/

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/121189

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX