表单类__init__无法工作

0 投票
3 回答
597 浏览
提问于 2025-04-16 00:54

我有一个表单类:

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(如果有传入的话)或者False,但在MyForm的主体部分我却遇到了name 'notvalidate' is not defined的错误(或者如果我检查self.notvalidate,就会出现name 'self' is not defined的错误)。这到底是怎么回事呢?

3 个回答

0

notvalidate 改成 self.notvalidate

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

你想要做的是改变类里面的一个属性 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)

不过我强烈建议你不要这么做。

撰写回答