我有这个表格类:
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
)。有什么问题?
答案 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
。