2

我通过继承创建了一个自定义用户模型django.contrib.auth.models.User,并将其添加到我的管理员中。MyUser当我从管理员创建实例时,我有两个(相关)问题:

1-在管理员中,普通密码(未加密)显示在password字段中

2-当我尝试使用实例登录我的管理员时MyUser,我得到

Unknown password hashing algorithm '<mypassword>'. Did you specify it in the PASSWORD_HASHERS setting    

这是一个错误吗?我该如何解决?(我正在使用 Django 1.4.2)

模型.py

from django.contrib.auth.models import User

class MyUser(User):
    number = models.IntegerField()

管理员.py

class MyUserAdmin(admin.ModelAdmin):
    pass

admin.site.register(MyUser, MyUserAdmin)

编辑

使用以下密码设置正确,但是当我想MyUser从管理员修改某些实例时,密码被清除,我必须再次设置它:

class MyUserAdminForm(forms.ModelForm):

    class Meta:
        model = MyUser

    def __init__(self, *args, **kwargs):
        super(MyUserAdminForm, self).__init__(*args, **kwargs)
        self.fields['password'].widget = forms.PasswordInput()

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


class MyUserAdmin(admin.ModelAdmin):
    form = MyUserAdminForm


admin.site.register(MyUser, MyUserAdmin)
4

2 回答 2

5

发生这种情况是因为您没有在表单上正确设置密码。

应使用set_password()方法https://docs.djangoproject.com/en/dev/topics/auth/#django.contrib.auth.models.User.set_password设置 Django auth 用户密码

通常,用户管理表单上的保存方法会处理此问题,但由于您已经创建了自己的表单,因此您必须自己执行此操作。这是您在管理表单上需要的保存方法的示例:

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

编辑:虽然这是您遇到此错误的原因,但我同意史蒂夫的观点,即您应该使用用户配置文件和此处的说明:https ://docs.djangoproject.com/en/1.4/topics/auth/#storing-关于用户的附加信息

或者,如果您可以等到 django 1.5 出来,它有一个可配置的用户模型:https ://docs.djangoproject.com/en/dev/releases/1.5-beta-1/#configurable-user-model

编辑 2:这正是您需要使用正确密码保存的内容:

表格.py

class MyUserAdminForm(forms.ModelForm):
    password1 = forms.CharField(widget=forms.PasswordInput)

    class Meta:
        model = MyUser

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

管理员.py

class MyUserAdmin(admin.ModelAdmin):
    form = MyUserAdminForm

admin.site.register(MyUser, MyUserAdmin)
于 2012-12-11T17:10:24.947 回答
0

我建议您采用稍微不同的方法来扩展 User 类。

DjangoUser Profiles用作一种简单的方法来存储有关用户的附加信息。

你可以在你的新类中做一个一对一的字段,这将允许信息只链接到一个用户。

class MyUser(User):
    user = models.OneToOneField(User)

    #additional fields
    number = models.IntegerField()

文档可以在这里找到- 让您也可以在管理部分使用它

于 2012-12-11T17:03:57.223 回答