метод очистки формы перезаписи django

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

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 ответов


вы можете проверить, были ли добавлены какие-либо ошибки в ошибку dict:

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 

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

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

использовать self.is_valid().


вот простой пример переопределения 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)

хотя его старый пост, если вы хотите применить проверки на более чем 1 поле той же формы / modelform use 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

если вы просто хотите проверить на одном поле формы / modelform использовать 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