Django перезаписать форму чистого метода - PullRequest
6 голосов
/ 12 марта 2010

При перезаписи метода очистки формы, как узнать, не прошла ли его проверка на каком-либо из полей? например в форме ниже, если я перезаписываю чистый метод, как узнать, не прошла ли проверка формы по какому-либо из полей?

class PersonForm(forms.Form):
    title = Forms.CharField(max_length=100)
    first_name = Forms.CharField(max_length=100)
    surname = Forms.CharField(max_length=100)
    password = Forms.CharField(max_length=100)

def clean(self, value):
    cleaned_data = self.cleaned_data

    IF THE FORM HAS FAILED VALIDATION:
        self.data['password'] = 'abc'
        raise forms.ValidationError("You have failed validation!")
    ELSE:
        return cleaned_data 

Спасибо

Ответы [ 4 ]

10 голосов
/ 12 марта 2010

Вы можете проверить, были ли какие-либо ошибки добавлены к сообщению об ошибке:

def clean(self, value):
    cleaned_data = self.cleaned_data

    if self._errors:
        self.data['password'] = 'abc'
        raise forms.ValidationError("You have failed validation!")
    else:
        return cleaned_data 

БОНУС! Вы можете проверить наличие ошибок в определенных полях:

def clean(self, value):
    cleaned_data = self.cleaned_data

    if self._errors and 'title' in self._errors:
        raise forms.ValidationError("You call that a title?!")
    else:
        return cleaned_data 
4 голосов
/ 12 марта 2010

Если ваши данные не проверены, ваш Экземпляр формы не будет иметь атрибут cleaned_data

Django Doc о доступе к «чистым» данным

Использование self.is_valid().

1 голос
/ 02 февраля 2018

Хотя это старый пост, если вы хотите применить проверки к более чем одному полю одной формы / модели, используйте clean(). Этот метод возвращает cleaned_data словарь.

Для отображения ошибок пользователям вы можете использовать метод add_error(<fieldname>, "your message"). Это покажет ошибки вместе с именем поля в верхней части формы. Пример показан ниже:

add_error() автоматически удаляет поле из словаря cleaned_data , вам не нужно удалять его вручную. Также вам не нужно ничего импортировать, чтобы использовать это.

документация здесь

def clean(self):

  if self.cleaned_data['password1'] != self.cleaned_data['password2']:
    msg = 'passwords do not match'
    self.add_error('password2', msg)

  return self.cleaned_data

Если вы просто хотите проверить правильность одного поля формы / модели, используйте clean_<fieldname>(). Этот метод будет принимать значения из словаря cleaned_data , а затем вы сможете проверять наличие логических ошибок. Всегда возвращайте значение после проверки логики.

def clean_password(self):

  password = self.cleaned_data['password']

  if len(password)<6:
    msg = 'password is too short'
    self.add_error('password', msg)

  return password
0 голосов
/ 28 июня 2014

Вот простой пример переопределения clean() в django.forms.Form, а также использования django-braces для AnonymousRequiredMixin для требования, чтобы только анонимные пользователи посещали страницу Loing:

class LoginView(AnonymousRequiredMixin, FormView):
    """
    Main Login. And Social Logins
    """
    template_name = 'core/login.html'
    form_class = LoginForm
    success_url = reverse_lazy('blog:index')

    def get_success_url(self):
        try:
            next = self.request.GET['next']
        except KeyError:
            next = self.success_url
        return next

    def form_valid(self, form):
        cd = form.cleaned_data
        user = auth.authenticate(username=cd['login_username'], 
            password=cd['login_password'])
        if user:
            auth.login(self.request, user)
            messages.info(self.request, 'You are logged in.')
        return super(LoginView, self).form_valid(form)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...