表单类__init__无法工作
我有一个表单类:
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)
不过我强烈建议你不要这么做。