Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/315.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 扩展UserCreationForm:未保存密码_Python_Django - Fatal编程技术网

Python 扩展UserCreationForm:未保存密码

Python 扩展UserCreationForm:未保存密码,python,django,Python,Django,我已成功创建并扩展了用户创建表单以获取电子邮件,名字&姓氏。它可以很好地插入所有值。但是我认为密码字段没有被保存。我正在使用内置的auth对象对登录到我的站点的用户进行身份验证。当用户在站点中注册并尝试登录时,密码不匹配,用户无法登录。当我从admin更改密码时,我可以成功登录。有人能帮我吗? 这就是我如何扩展UserCreationForm: from django import forms from django.contrib.auth.forms import User from dja

我已成功创建并扩展了
用户创建表单
以获取
电子邮件
名字
&
姓氏
。它可以很好地插入所有值。但是我认为
密码
字段没有被保存。我正在使用内置的
auth
对象对登录到我的站点的用户进行身份验证。当用户在站点中注册并尝试登录时,
密码不匹配,用户无法登录。当我从
admin
更改
密码时,我可以成功登录。有人能帮我吗?
这就是我如何扩展
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
现在,我点击表单链接,更改密码。

问题 您的代码正在调用
UserCreationForm
的super,而不是您自己的表单
RegistrationForm
的super。(超级用户创建表单
UserCreationForm
being
ModelForm
不知道如何像保存密码一样处理用户注册)

结果是没有在任何地方调用
user.set\u 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

解决方案 你应该有这样的东西

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

出于好奇,您如何更改管理员的密码?您是否将密码直接输入字段?还是密码重置程序?谢谢!但是你能解释一下为什么密码是用
email
字段保存的,而不是用我以前的代码使用的其他字段。我非常怀疑这与“email only”有什么关系,因为你的密码在数据库中是空的,很明显问题出在用户身上。_set_password没有在任何地方被调用(手动或通过super)。可能您忘记了您在尝试
电子邮件时添加了
用户。设置密码()
仅版本:P
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