V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
rcmerci
V2EX  ›  Django

django 中关于 forms 的问题

  •  
  •   rcmerci ·
    RCmerci · 2014-07-06 13:37:16 +08:00 · 4048 次点击
    这是一个创建于 3829 天前的主题,其中的信息可能已经有所发展或是发生改变。
    比如有如下的代码
    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函数 起到的作用是一样的吗?
    如果一样的话,那么这两种写法的区别在哪里呢?
    谢谢~
    ============================================
    我晕,,为什么缩进没了。。。
    ===============================
    谁能告诉我怎么缩进吗?我编辑的时候是有缩进的呀!
    8 条回复    2014-07-06 21:36:41 +08:00
    P9
        1
    P9  
       2014-07-06 16:38:54 +08:00   ❤️ 1
    看的好累…
    clean_* 函数,应该是一个检查函数的总入口,validate_*是检查某个值用的把
    具体还要看django文档
    izoab
        2
    izoab  
       2014-07-06 19:05:53 +08:00
    缩进问题实在不行就截图吧。

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

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

    让一个函数只做一件特定的事,clean和validate不要混在一起写。
    rcmerci
        4
    rcmerci  
    OP
       2014-07-06 19:29:49 +08:00
    @pythoner 那就是说表单的验证都应该在Field的validator=[validate_test,...],都放在这里面吗?而不是在clean_*里面验证数据正确性?
    还有我不太清楚 [clean_*方法用来清理字段用的] 这句话,可以解释一下吗?
    谢啦:)
    pythoner
        5
    pythoner  
       2014-07-06 19:44:28 +08:00   ❤️ 1
    @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
        6
    rcmerci  
    OP
       2014-07-06 20:02:04 +08:00
    @pythoner 谢谢啦,我还有个问题:
    比如:validate_test这个函数,可不可以放在一个class TestForm里面作为一个成员函数,还是一定要定义在class外面呢?
    no13bus
        7
    no13bus  
       2014-07-06 20:49:34 +08:00
    @rcmerci 我觉得看情况吧。比如这个验证是多个form都回用到的,那么就写到外面,如果仅仅是这个form用 就写在form自己的这个class里面
    vicalloy
        8
    vicalloy  
       2014-07-06 21:36:41 +08:00   ❤️ 1
    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/
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   2797 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 23ms · UTC 12:30 · PVG 20:30 · LAX 04:30 · JFK 07:30
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.