Django Отображается ошибка проверки формы Django Страница отладки - PullRequest
0 голосов
/ 01 августа 2020

У меня есть представление регистрации, которое принимает адрес электронной почты, пароль, пароль подтверждения и дополнительную строку, которая должна быть уникальной. Все мои ошибки проверки возвращаются правильно (например, если электронное письмо дублируется, оно должно быть уникальным, а если пароли не совпадают, отображается, что пароли не совпадают). Однако дополнительная строка отображает страницу отладки django с ошибкой проверки, а не отображает ее в форме. Почему это происходит?

Django ошибка страницы отладки:

ValidationError at /signup/
['Extra string must be unique.']

Выдержка из шаблона:

                    {% for field in form %}
                        <div class="form-group">

                            {% for error in field.errors %}
                                <p style="color: red">{{ error }}</p>
                            {% endfor %}
                            <label for="{{ field.id_for_label }}">{{ field.label }}:</label>
                            {{ field }}

                        </div>
                    {% endfor %}

Форма:

class UserCreationForm(forms.ModelForm):

    password1 = forms.CharField(label='Password', widget=forms.PasswordInput(attrs={'class': 'form-control'}))
    password2 = forms.CharField(label='Password confirmation', widget=forms.PasswordInput(attrs={'class': 'form-control'}))
    email = forms.CharField(label='Email', widget=forms.EmailInput(attrs={'class': 'form-control'}))
    extra_string = forms.CharField(label='Extra String (Must be unique)', widget=forms.TextInput(attrs={'class': 'form-control'}))
    class Meta:
        model = User
        fields = ('email',)

    def clean_password2(self):
        """A function to check that the two passwords provided by the user match."""
        # Check that the two password entries match
        #: User's password.
        password1 = self.cleaned_data.get("password1")
        #: Password confirm.
        password2 = self.cleaned_data.get("password2")
        if password1 and password2 and password1 != password2:
            raise forms.ValidationError("The passwords must match.") #: This displays properly
        return password2
    def ensure_unique_string(self):
        """Checks that the entered extra string is unique"""

        extra= self.cleaned_data.get("extra_string")
        if len(ExtraString.objects.filter(name=extra)) > 0:
            raise forms.ValidationError("Ana Group Name must be unique.") #: This displays django debug page
        return extra
    def save(self, commit=True):
        user = super(UserCreationForm, self).save(commit=False)
        user.set_password(self.clean_password2())
        user.extra_string = self.ensure_unique_string()
        user.has_migrated_pwd = True
        if commit:
            user.save()
        return user

Просмотр регистрации:

class SignUpView(View):
    template_name = "account/signup.html"

    def get(self, request):
        form = UserCreationForm()
        return render(request=request, template_name=self.template_name, context={
            "form": form
        })

    def post(self, request):
        form = UserCreationForm(request.POST)
        if form.is_valid():
            user = form.save()
            messages.success(request, 'Successfully Registered')
            next_url = request.POST.get('next') if 'next' in request.POST else 'profile'
            return redirect(next_url)

        return render(request, template_name=self.template_name, context={"form": form})

1 Ответ

1 голос
/ 01 августа 2020

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

у вас есть 2 решения:

в clean_FIELD_NAME:

   def clean_extra_string(self, data):
        if len(ExtraString.objects.filter(name=data)) > 0:
            raise forms.ValidationError("Ana Group Name must be unique.")
        return data

в методах проверки:

 def validate(self, validate_data):
        if len(ExtraString.objects.filter(name=validate_data['extra'])) > 0:
            raise forms.ValidationError("Ana Group Name must be unique.")

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