Форма класса __init__ не работает - PullRequest
0 голосов
/ 07 июля 2010

У меня есть этот класс формы:

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 ]

2 голосов
/ 07 июля 2010

Переместите 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 голос
/ 07 июля 2010

То, что вы пытаетесь достичь, это изменить атрибут уровня класса 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)

Хотя я настоятельно рекомендую НЕ делать этого.

0 голосов
/ 07 июля 2010

Изменить notvalidate на self.notvalidate.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...