2012-07-08 19 views
3

这应该是一个Django特定的,但我想它是Python。Django - 保留原始方法的工作并添加新的自定义验证

基本上,我不想重写我继承的类中的原始方法的工作(可能是一个Model类),但我想添加额外的验证。 这可能吗?任何提示?

class MyUserAdminForm(forms.ModelForm): 
    class Meta: 
     model = User 

    def clean(self): 
     // do some additional work even though it's cleaned by parent's clean method 

回答

5

调用super类清洁方法:

def clean(self): 
    super(MyUserAdminForm, self).clean() 
    # more cleaning 

这是一个常见的蟒蛇的事情时,你继承的东西,functionaly重新定义,但想要让做的一定要保持超类的功能。在执行init方法时非常常见,因为您始终需要确保调用超类构造函数来设置实例。

+1

对于OP,请注意''super'的问题:第一个参数是* current *类的名称。 – 2012-07-08 19:29:00

+0

@jdi谢谢。这是非常有用的知道。我正在考虑同样的事情,但我只看到过__init__'被使用。所以我可以用任何'clean_'方法做同样的事情,或者只是碰巧有任何方法:) – User007 2012-07-08 19:31:24

+0

@ User007:雅几乎。就像我说的那样,init的超级普通,所以我相信你已经看到了它。 'super()'是一个帮助函数,用于查找要调用的正确的超类方法。这是一个明智的做法'forms.ModelForm.clean(self)'。超级数字出哪个班级给你打电话“干净”。 – jdi 2012-07-08 21:32:59

0
class ContactForm(forms.Form): 
     message = forms.CharField() 
     def clean_message(self): 
       num_words = len(message.split()) 
       if num_words<4: 
         raise forms.ValidationError("Too short a message!") 
       return message 

这是您在字段中添加验证方法的方式,这确实可以确保发生默认清理。没有必要再次调用默认的清理方法。

来源:www.djangobook.com

工作原理:

当is_valid()被调用的表单对象时,系统会在类与clean_开始和结尾的任何方法属性名称。如果他们这样做,它运行之后运行默认的清理方法。

+0

谢谢。我知道这一点,但我认为这不会解决我的问题。默认的清理是特定的wdiget。如果它是一个密码字段,它有它自己的默认清理。如果您从自己的Form/ModelForm继承,并且如果您只是放入'clean_message',您将覆盖您在父类中定义的原始方法。这是我遇到的问题。 – User007 2012-07-08 19:34:46

+0

'clean_ ()'在默认的清理方法之后调用**。 – SiddharthaRT 2012-11-25 06:55:13