Объект «WSGIRequest» не имеет атрибута «сообщение» с пользовательской регистрационной формой

Я просмотрел множество сообщений с похожими проблемами, и ответы ничего не сделали для моего кода. Я использую пользовательскую регистрационную форму для сайта, над которым я работаю, для которого требуется электронная почта. большая часть кода в нем основана на коде, встроенном в django. Я попытался создать новый класс формы на основе django.contrib.auth.forms.UserCreationForm и все равно получаю ту же ошибку.

Форма, основанная на той, что в django

class UserCreateFrom(UserCreationForm):
    """
    A form that creates a user, with no privileges, from the given username and
    password.
    """
    error_messages = {
        'duplicate_username': _("A user with that username already exists."),
        'duplicate_email': _("That email is already in use"),
        'password_mismatch': _("The two password fields didn't match."),
    }
    email = forms.EmailField(label=_("Email Address"),
                             required=True,
                             help_text="Required. Your Email Address for password resets, and other emails from us")

    def clean_email(self):
        email = self.cleaned_data["email"]
        try:
            User._default_manager.get(email=email)
        except User.DoesNotExist:
            return email
        raise forms.ValidationError(
            self.error_messages['duplicate_email'],
            code='duplicate_email',
        )

форма, используемая в настоящее время

class UserCreateFrom(forms.ModelForm):
    """
    A form that creates a user, with no privileges, from the given username and
    password.
    """
    error_messages = {
        'duplicate_username': _("A user with that username already exists."),
        'duplicate_email': _("That email is already in use"),
        'password_mismatch': _("The two password fields didn't match."),
    }
    username = forms.RegexField(label=_("Username"), max_length=30,
                                regex=r'^[\w.@+-]+$',
                                help_text=_("Required. 30 characters or fewer. Letters, digits and "
                                            "@/./+/-/_ only."),
                                error_messages={
                                    'invalid': _("This value may contain only letters, numbers and "
                                                 "@/./+/-/_ characters.")
                                    }
                                )
    email = forms.EmailField(label=_("Email Address"),
                             required=True,
                             help_text="Required. Your Email Address for password resets, and other emails from us")
    password1 = forms.CharField(label=_("Password"),
                                widget=forms.PasswordInput)
    password2 = forms.CharField(label=_("Password confirmation"),
                                widget=forms.PasswordInput,
                                help_text=_("Enter the same password as above, for verification."))

    class Meta:
        model = User
        fields = ("username",)

    def clean_username(self):
        # Since User.username is unique, this check is redundant,
        # but it sets a nicer error message than the ORM. See #13147.
        username = self.cleaned_data["username"]
        try:
            User._default_manager.get(username=username)
        except User.DoesNotExist:
            return username
        raise forms.ValidationError(
            self.error_messages['duplicate_username'],
            code='duplicate_username',
        )

    def clean_email(self):
        email = self.cleaned_data["email"]
        try:
            User._default_manager.get(email=email)
        except User.DoesNotExist:
            return email
        raise forms.ValidationError(
            self.error_messages['duplicate_email'],
            code='duplicate_email',
        )

    def clean_password2(self):
        password1 = self.cleaned_data["password1"]
        password2 = self.cleaned_data["password2"]
        if password1 and password2 and password1 != password2:
            raise forms.ValidationError(
                self.error_messages['password_mismatch'],
                code='password_mismatch',
            )
        return password2

    def save(self, commit=True):
        user = super(UserCreateFrom, self).save(commit=False)
        user.set_password(self.cleaned_data["password1"])
        if commit:
            user.save()
        return user

представление, над которым я не смог работать, если форма действительна, поскольку я не могу заставить ее работать без данных UserCreateFrom — это моя пользовательская регистрационная форма, импортированная из froms.py в том же приложении.

@sensitive_post_parameters()
@csrf_protect
@never_cache
def register(request):
    """
    Allow registration of new users
    :param request:
    :return:
    """
    context = {}
    form = UserCreateFrom(data=request.post)
    context.update({'form': form})
    if request.method == 'POST' and form.is_valid():
        return render(request, 'test.html', context)
    else:
        return render(request, 'register.html', context)

если я переключаю form = UserCreateFrom(data=request.post) на form = UserCreateFrom(request), я получаю, что объект «WSGIRequest» не имеет атрибута «получить» ошибку, но таким образом, по крайней мере, ошибки в шаблоне прямо там, где форма вызывается через `{{ form }}, а не представление.


person Termanater13    schedule 05.03.2015    source источник


Ответы (1)


Атрибут данных называется request.POST.

Но вы должны переместить это в блок, который проверяет метод.

person Daniel Roseman    schedule 05.03.2015