表单类__init__不起作用

时间:2010-07-07 03:14:00

标签: python django django-forms

我有这个表格类:

class MyForm(forms.Form):
    def __init__(self, *args, **kwargs):
        self.notvalidate = kwargs.pop('notvalidate',False)
        super(MyForm, self).__init__(*args, **kwargs)

    email = forms.EmailField(widget=forms.TextInput(attrs=dict(attrs_dict,maxlength=75)))
    (...)

    if not notvalidate:        
        def clean_email(self):
            email = self.cleaned_data.get("email")
            if email and User.objects.filter(email=email).count() > 0:
                raise forms.ValidationError(
                    _(u"Email already used."))
            return email

虽然在 init 中我将self.notvalidate值设置为True(如果已给出)或MyForm正文中的False我得到name 'notvalidate' is not defined(或者如果我检查自己.notvalidate - name 'self' is not defined)。有什么问题?

3 个答案:

答案 0 :(得分:2)

if not notvalidate移至clean_email方法,并使用self.notvalidate引用它。

    def clean_email(self):
       if not self.notvalidate:   
           email = self.cleaned_data.get("email")
           if email and User.objects.filter(email=email).count() > 0:
                raise forms.ValidationError(
                    _(u"Email already used."))
        return email

此外,您可能希望将标记重命名为should_validate_email并失去否定。

答案 1 :(得分:1)

您要实现的目标是更改类级别属性clean_email,但您希望使用实例属性self.notvalidate来实现,因此您在这里做了相反的事情。最简单的不验证方法是检入clean_email并返回例如

def clean_email(self):
    if self.notvalidate:
        return

     ....

但是如果由于某些神秘的原因你根本不想让clean_mail方法存在于类中,你需要使用元类或更简单的方法创建一个类来调用一个函数来创建类例如

def createFormClass(validate):
    class MyClass(object):
        if validate:
            def clean_email(self):
                pass

    return MyClass

MyClassValidated = createFormClass(True)
MyClassNotValidated = createFormClass(False)

虽然我强烈建议不要这样做。

答案 2 :(得分:0)

notvalidate更改为self.notvalidate