Django form.is_valid () не вызывает метод clean_ <fieldname> - PullRequest
2 голосов
/ 02 января 2011

Я скопировал простой пример страницы регистрации пользователя в Django 1.0 Web Site Development. Я определил следующую форму:

class RegistrationForm(forms.Form):
    username = forms.CharField(label=u'Username', max_length=30)
    email = forms.EmailField(label=u'Email')
    password1 = forms.CharField(
        label=u'Password',
        widget=forms.PasswordInput()
    )
    password2 = forms.CharField(
        label=u'Password (Again)',
        widget=forms.PasswordInput()
    ) 

    def clean_password2(self):
        if 'password1' in self.cleaned_data:
            password1 = self.cleaned_data['password1']
            password2 = self.cleaned_data['password2']
            if password1 == password2:
                return password2
        raise forms.ValidationError('Passwords do not match.')

    def clean_username(self):
        print "Validating username..."
        username = self.cleaned_data['username']
        if not re.search(r'^\w+', username):
            raise forms.ValidationError('Username can only contain '
                                        'alphanumeric characters and the underscore.')
        try:
            User.objects.get(username=username)
        except User.DoesNotExist:
            return username
        raise forms.ValidationError('Username is already taken')

В случае, когда имя пользователя уже занято, поле проверяется с использованием обычной проверки формы, и мой метод очистки не вызывается. Когда форма отправляется на register_page, form.is_valid () возвращает True.

Что-то не хватает, что нужно сделать, чтобы Джанго узнал, как вызывать методы clean_?

def register_page(request):
    if request.method == 'POST':
        print "Posted to registration form"
        form = RegistrationForm(request.POST)
        if form.is_valid():
            user = User.objects.create_user(
                username=form.cleaned_data['username'],
            password=form.cleaned_data['password1'],
                email=form.cleaned_data['email']
            )
            return HttpResponseRedirect('/')
    else:
        form = RegistrationForm()

    return render_to_response(
        'users/registration.html',
        context_instance=RequestContext(request, {
                'form' : form
                })

Ответы [ 2 ]

4 голосов
/ 28 июня 2011

В случае, если кто-то еще попадет сюда через Google, и приведенный выше ответ не поможет:

У меня была такая же проблема, и оказалось, что я не устанавливал исключение как кортеж в своей мета-форме:

class MyFormClass(ModelForm):
    class Meta:
        exclude = ('type_detail')  #wrong

вместо:

class MyFormClass(ModelForm):
    class Meta:
        exclude = ('type_detail', )  #right
0 голосов
/ 04 января 2011

Это было действительно загадочно.Я восстановил версию автосохранения файла forms.py, и он волшебным образом начал работать, но нет никакой разницы, что я могу различить фрагмент кода выше и восстановленный файл.

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