Django Forms - ошибка проверки показана дважды - PullRequest
0 голосов
/ 21 июня 2019

Я хочу показать некоторые ошибки проверки для полей в форме:

  • Если электронная почта уже существует
  • Если имя пользователя меньше 8 символов
  • Если пароли не совпадают
  • Если поле пароля меньше 8 символов

forms.py

class RegisterForm(forms.Form):

    username = forms.CharField(widget = forms.TextInput(attrs ={"class":"form-control mb-2 mr-sm-2" ,"placeholder":"username"}))
    email = forms.EmailField(widget = forms.TextInput(attrs = {"class":"form-control mb-2 mr-sm-2"}))
    password = forms.CharField(widget = forms.PasswordInput(attrs = {"class":"form-control mb-2 mr-sm-2"}))
    password2 = forms.CharField(label = "Confirm Password",widget = forms.PasswordInput(attrs = {"class":"form-control mb-2 mr-sm-2"}))

    def clean(self):
        data = self.cleaned_data
        password = self.cleaned_data.get('password')
        password2 = self.cleaned_data.get('password2')
        if password2!=password:
            raise forms.ValidationError("Passwords dont match")
        if len(password)<8:
            raise forms.ValidationError("Password must be atleast 8 characters long")
        return data

    def clean_username(self):
        username = self.cleaned_data.get('username')
        qs = User.objects.filter(username = username)
        if qs.exists():
            raise forms.ValidationError("username exists")
        return username

    def clean_email(self):
        email = self.cleaned_data.get('email')
        qs = User.objects.filter(email = email)
        if qs.exists():
            raise forms.ValidationError("email exists",code="error1")
        return email'''

register.html

<form method="POST" class="was-validated">

    {% csrf_token %}
    <div class="form-group">
        {% if form.errors %}
        {% for field in form %}
        {% for error in field.errors %}
        <div class="alert alert-danger">
            <strong>{{ error|escape }}</strong>
        </div>
        {% endfor %}
        {% endfor %}
        {% for error in form.non_field_errors %}
        <div class="alert alert-danger">
            <strong>{{ error|escape }}</strong>
        </div>
    {% endfor %}
    {%endif%}

        {{form.as_p}}
    </div>
    <button type="submit" class="btn btn-primary">Submit</button>
</form>'''

Я хочу, чтобы ошибка проверки отображалась только один раз.Я не хочу ошибки над каждым полем.Я просто хочу, чтобы все ошибки были наверху.

1 Ответ

0 голосов
/ 21 июня 2019

вы можете использовать self.add_error вместо повышения форм. ValidationError:

class UserRegisterForm(forms.Form):
    # [...stuff...]
    password = forms.CharField(widget=forms.PasswordInput)
    password_confirm = forms.CharField(widget=forms.PasswordInput)

    def clean(self):
        '''Required custom validation for the form.'''
        super(forms.Form,self).clean()
        if 'password' in self.cleaned_data and 'password_confirm' in self.cleaned_data:
            if self.cleaned_data['password'] != self.cleaned_data['password_confirm']:
                self._errors['password'] = [u'Passwords must match.']
                self._errors['password_confirm'] = [u'Passwords must match.']
        return self.cleaned_data

, который вы можете использовать в шаблоне:

   {% for error in form.non_field_errors %}
        {{error}}
    {% endfor %}

, для которого вы установили _errors ['FIELDNAME']форма для пометки недопустимых полей.(помните, что метод clean должен возвращать элемент cleaned_data. Это на некоторое время укусило меня сзади)

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