django.contrib.admin.sites.NotRegistered: 模型User未注册。当我想要注册我的自定义用户时出现了这个错误。

10

我通过电子邮件覆盖默认模型AbstractUse来进行授权。

applications.account.models.py

# -*- coding: utf-8 -*-
import datetime

from django.db import models
from django.contrib.auth.models import AbstractUser

class User(AbstractUser):

class Meta(AbstractUser.Meta):
    swappable = 'AUTH_USER_MODEL'

USERNAME_FIELD = 'email'

应用程序.account.admin.py 并在admin.py文件中使用我的自定义用户。 我尝试取消注册默认的用户模型并注册自定义模型。


并在 admin.py 文件中使用我的自定义用户。 我尝试取消注册默认的用户模型,并注册自定义模型。

# -*- coding: utf-8 -*-
from django.contrib import admin
from django.http import HttpResponseRedirect
from django.contrib.auth.models import User

from modeltranslation.admin import TabbedTranslationAdmin
from applications.account.models import Profile, Phone, ShippingAddress, PartnerGC, Referral, Operation
from applications.account.models import User as MyUser


class UserInline(admin.StackedInline):
    model = Profile
    max_num = 1
    can_delete = False


class OperationInline(admin.StackedInline):
    model = Operation
    can_delete = True


class PhoneInline(admin.StackedInline):
    model = Phone
    can_delete = True


class PartnerGCInline(admin.StackedInline):
    model = PartnerGC
    max_num = 1
    can_delete = True


class ReferralInline(admin.StackedInline):
    model = Referral
    max_num = 1
    can_delete = True


class ShippingAddressInline(admin.StackedInline):
    model = ShippingAddress
    can_delete = True


class ProfileAdmin(admin.ModelAdmin):
    list_filter = ["date_joined"]
    search_fields = ["=id", "first_name", 'last_name', "email"]
    list_display = ('id', "email", 'first_name', 'last_name', 'date_joined',
                    'last_login')
    actions = ['mark_active', 'mark_inactive']
    inlines = [UserInline, PhoneInline, ShippingAddressInline, PartnerGCInline, ReferralInline, OperationInline]

    def user_email(self, instance):
        return instance.user.email
    user_email.short_description = u"E-mail"

    def user_active(self, instance):
        return instance.user.is_active
    user_active.short_description = u"Активен"
    user_active.boolean = True

    def user_staff(self, instance):
        return instance.user.is_staff
    user_staff.short_description = u"Персонал"
    user_staff.boolean = True

    def user_superuser(self, instance):
        return instance.user.is_superuser
    user_superuser.short_description = u"Администратор"
    user_superuser.boolean = True

    def user_date_joined(self, instance):
        return instance.user.date_joined
    user_date_joined.short_description = u"Дата регистрации"

    def user_last_login(self, instance):
        return instance.user.last_login
    user_last_login.short_description = u"Последняя активность"

    def mark_active(self, request, queryset):
        queryset.update(user__is_active=True)
        return HttpResponseRedirect('')
    mark_active.short_description = u"Активировать выбранные профили"

    def mark_inactive(self, request, queryset):
        queryset.update(user__is_active=False)
        return HttpResponseRedirect('')

admin.site.unregister(User)
admin.site.register(MyUser, ProfileAdmin)

请发布您的“INSTALLED_APPS”。 - itzMEonTV
我在我的INSTALLED_APPS中有'applications.account'。 - Анастасия Руденко
2个回答

12
如果您已将AUTH_USER_MODEL设置为自定义模型,则默认的User应用程序不应该被注册。因此,您应该删除试图注销默认用户模型的那一行代码。
admin.site.unregister(User)

是的,在我的设置中添加了AUTH_USER_MODEL ='applications.account.model.User',然后注册了自定义用户admin.site.register(MyUser, ProfileAdmin)但是我得到了一个新的错误ValueError: too many values to unpack - Анастасия Руденко
设置应该是 AUTH_USER_MODEL = '<app_name>.<model_name>,即 AUTH_USER_MODEL = 'account.User'。如果在正确设置 AUTH_USER_MODEL 之前运行了 makemigrationsmigrate,那么您可能需要删除迁移文件并删除数据库,因为它们将使用默认的 User 模型。 - Alasdair
我明白,但是我不能删除我的迁移并且删除数据库,因为这是一个正在运行的网站。 - Анастасия Руденко
1
在项目启动后切换默认用户到自定义用户是困难的。请参阅文档中的注释。 - Alasdair
我找到了另一种解决方案,可以使用EmailAuthBackEnd。 - Анастасия Руденко

2
django-hijack-admin文档中,有一个关于自定义管理员的部分:
您需要在settings.py中设置HIJACK_REGISTER_ADMIN = False 对于自定义用户管理员,可以按以下方式修改管理员类:
# admin.py
from hijack_admin.admin import HijackUserAdminMixin

class MyUserAdmin(UserAdmin, HijackUserAdminMixin):
    list_display = (
        ...
        'hijack_field',  # Hijack button
    )

对于外键指向User的模型,可以使用以下mixin:

Original Answer翻译成"最初的回答"

#admin.py
from django.contrib import Admin
from hijack_admin.admin import HijackRelatedAdminMixin

class MyCustomerAdmin(HijackRelatedAdminMixin, admin.ModelAdmin)
    list_display = ('user', 'hijack_field')

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接