python - 扩展 UserCreationForm : password not saved

标签 python django

我已经成功创建并扩展了 UserCreationForm 以获取 emailfirst_namelast_name。它可以很好地插入所有值。但我认为 password 字段没有被保存。我使用内置的 auth 对象来验证用户登录到我的网站。当用户在网站上注册并尝试登录时,password 不匹配,用户无法登录。当我从 admin 更改 password 时,我可以成功登录。那么,有人可以帮助我吗? 这就是我扩展 UserCreationForm 的方式:

from django import forms
from django.contrib.auth.forms import User
from django.contrib.auth.forms import UserCreationForm


class RegistrationForm(UserCreationForm):
    email = forms.EmailField(required=True)
    first_name = forms.TextInput()
    last_name = forms.TextInput()

    class Meta:
        model = User
        fields = ("username", "first_name", "last_name", "email", "password1", "password2")

    def save(self, commit=True):
        user = super(UserCreationForm, self).save(commit=False)
        user.email = self.cleaned_data['email']
        user.first_name = self.cleaned_data['first_name']
        user.last_name = self.cleaned_data['last_name']

        if commit:
            user.save()

        return user

How I change my password usgin admin? 现在,我单击 表单 链接并更改密码。

最佳答案

问题

def save(self, commit=True):
    user = super(UserCreationForm, self).save(commit=False)
                 ^
                 |___ super of UserCreationForm is ModelForm!

您的代码正在调用 UserCreationForm 的父类(super class),而不是您自己的表单 RegistrationForm 的父类(super class)。 (UserCreationForm 的 super 是ModelForm 不知道如何处理用户注册,如密码保存)

结果是 user.set_password() 没有在任何地方被调用

但是,我认为不需要再次调用 user.set_password,因为您的 super 已经调用了。

UserCreationForm.save() 定义如下:

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

Source code on github

解决方案

你应该有这样的东西

def save(self, commit=True):
    # Call save of the super of your own class,
    # which is UserCreationForm.save() which calls user.set_password()
    user = super(RegistrationForm, self).save(commit=False) 

    # Add the things your super doesn't do for you
    user.email = self.cleaned_data['email']
    user.first_name = self.cleaned_data['first_name']
    user.last_name = self.cleaned_data['last_name']

    if commit:
        user.save()

    return user

关于python - 扩展 UserCreationForm : password not saved,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34849328/

相关文章:

javascript - Django View 中的通用身份验证

django - 调整缩略图大小django Heroku, 'backend doesn'支持绝对路径'

python - 更改 matplotlib.pyplot 点的颜色

python - 管理 django 的 slug

python - django 多个站点 wsgi 就足够了吗?

django - Facebook FB.logout 在 IE 中不起作用

python - 你如何给 wagtail/django 页面一个自定义的 url 来服务?

java - 通过 java-%1 在 cmd 中运行 python 文件不是有效的 Win32 应用程序

Python:字典链接数据

python - 将 emacs 组织模式表读入 python pandas 数据帧的优雅方式