'WSGIRequest' 对象没有带有自定义注册表单的属性 'post'

'WSGIRequest' object has no attribute 'post' with custom registration form

我看过很多有类似问题的帖子,但答案对我的代码没有任何帮助。 我正在为我正在使用的网站使用自定义注册表格,该表格需要电子邮件。其中的大部分代码都基于 django 内置的代码。我已尝试基于 django.contrib.auth.forms.UserCreationForm 创建一个新表单 class,但仍然出现相同的错误。

基于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' object has no attribute 'get' 错误,但这种方式至少会在模板中出现错误通过 `{{ form }} 调用,而不是视图。

数据属性被称为request.POST

但是你应该把它移到检查方法的块中。