首页 > 解决方案 > django:“LoginForm”对象没有属性“cleaned_data”

问题描述

我正在尝试登录,但它不起作用。错误是 form.is_valid() return False 和

“LoginForm”对象没有属性“cleaned_data”

我想不通是问题所在。

用户/forms.py

class LoginForm(forms.Form):
    email = forms.EmailField(widget=forms.EmailInput(
        attrs={'style': 'width:100%; height:100%;'}))
    password = forms.CharField(widget=forms.PasswordInput(
        attrs={'style': 'width:100%; height:100%;'}))

    def __init__(self, request=None, *args, **kwargs):
        self.request = request
        super(LoginForm, self).__init__(*args, **kwargs)
        self.fields['email'].label = "이메일"
        self.fields['password'].label = "비밀번호"

    def clean(self):
        super().clean()
        email = self.cleaned_data.get("email")
        password = self.cleaned_data.get("password")
        try:
            user = models.User.objects.get(email=email)
            if user.check_password(password):
                return self.cleaned_data
            else:
                self.add_error("password", forms.ValidationError(
                    "비밀번호가 틀렸습니다."))
        except models.User.DoesNotExist:
            self.add_error("email", forms.ValidationError(
                "존재하지 않는 계정입니다."))

用户/views.py

class LoginView(mixins.LoggedOutOnlyView, View):
    def get(self, request):
        form = forms.LoginForm(request.POST)
        return render(request, "users/login.html", {"form": form})

    def post(self, request):
        form = forms.LoginForm(request.POST or None)
        print(form.is_valid())
        if form.is_valid():
            email = form.cleaned_data.get("email")
            password = form.cleaned_data.get("password")

            get_user_name = user_models.User.objects.get(email=email)
            user = authenticate(
                request, username=get_user_name, password=password)
            if user is not None:
                login(request, user)
                return redirect(reverse("cores:home"))
        else:
            return render(request, "users/login.html", {"form": form})

标签: django

解决方案


super()您需要使用调用的返回值设置一个局部变量。在您的字段中,您不再调用self.cleaned_data变量,而是调用局部变量cleaned_datacleaned_data在方法结束时也返回def clean()- 即使发生错误。

    def clean(self):
        cleaned_data = super().clean()

        email = cleaned_data.get("email")
        password = cleaned_data.get("password")
        ...

        # Don't forget to return the cleaned_data after everything
        return cleaned_data

这记录在 django 文档中:

https://docs.djangoproject.com/en/3.0/ref/forms/validation/#cleaning-and-validating-fields-that-depend-on-each-other


推荐阅读