Django 1.5自定义用户模型错误."经理无法使用;用户已被换掉"

bpe*_*tit 19 django django-admin django-users

我按照dev doc中的描述扩展了django用户模型.我不想保留大部分原始用户模型功能,因此我扩展了AbstractUser类.我在settings.py中定义了:

AUTH_USER_MODEL = 'myapp.CustomUser'
Run Code Online (Sandbox Code Playgroud)

我的用户类:

class CustomUser(AbstractUser):
  custom_field = models.ForeignKey('OtherModel')
  objects = UserManager()
Run Code Online (Sandbox Code Playgroud)

一切似乎工作正常,但当我尝试由管理网站管理:

admin.site.register(CustomUser, UserAdmin)
Run Code Online (Sandbox Code Playgroud)

我在管理员CustomUser创建页面上获得此错误(在验证密码确认表单后):

AttributeError: Manager isn't available; User has been swapped for 'myapp.CustomUser'
Run Code Online (Sandbox Code Playgroud)

关键是我需要管理站点管理的这个模型,以便拥有与原始用户模型相同的创建过程(使用密码验证的两步过程).

小智 20

您只需要更改表单以添加用户(覆盖clean_username并在get_user_model()上更改用户

完整的工作示例(如果您继承自AbstractUser)

from django.contrib.auth import get_user_model
from django.contrib.auth.admin import UserAdmin
from django.contrib.auth.forms import UserCreationForm, UserChangeForm


class MyUserChangeForm(UserChangeForm):

    class Meta:
        model = get_user_model()

class MyUserCreationForm(UserCreationForm):

    class Meta:
        model = get_user_model()

    def clean_username(self):
        username = self.cleaned_data["username"]
        try:
            get_user_model().objects.get(username=username)
        except get_user_model().DoesNotExist:
            return username
        raise forms.ValidationError(self.error_messages['duplicate_username'])

class MyUserAdmin(UserAdmin):
    form = MyUserChangeForm
    add_form = MyUserCreationForm
    fieldsets = (
        (None, {'fields': [('username', 'password'),]}),
        (_('Personal info'), {'fields': ('first_name', 'last_name', 'email')}),
        (_('Permissions'), {'fields': ('is_active', 'is_staff', 'is_superuser',
                                   'groups', 'user_permissions')}),
        (_('Important dates'), {'fields': ('last_login', 'date_joined')}),
        )

admin.site.register(MyUser, MyUserAdmin)
Run Code Online (Sandbox Code Playgroud)


Ala*_*ars 13

几个小时我一直在努力解决这个错误.对我来说,我需要删除所有引用

from django.contrib.auth.models import User
Run Code Online (Sandbox Code Playgroud)

然后将其替换为:

from myapp.models import MyUser as User
Run Code Online (Sandbox Code Playgroud)

这假设您的自定义用户模型位于名为的应用程序中,myapp并且您调用了该模型MyUser.

我正在使用,as User所以我不必更改我的现有代码引用该User对象的位置django.contrib.auth.models.

祝好运!

艾伦

@aviars