django admin用于多种用户类型

时间:2018-01-23 15:20:09

标签: django django-admin

我有一个处理多种用户类型的应用。我需要一种方法来区分管理站点中的它们。一些代码来说明。

首先,我创建了一个 User 模型类,它继承自 AbstractUser

class User(AbstractUser):
    is_partner = models.BooleanField(default=False)
    is_client = models.BooleanField(default=False)
    email = models.EmailField(unique=True)

合作伙伴和客户用户拥有不同的数据:

class ClientProfile(models.Model):
    user = models.OneToOneField(User, on_delete=models.CASCADE)
    ...

class PartnerProfile(models.Model):
    user = models.OneToOneField(User, on_delete=models.CASCADE)
    ...

客户端配置文件是通过我提供的SignUp表单创建的,之后,用户可以更新自己的配置文件。另一方面,合作伙伴资料由我自己创建为管理员,我需要通过django管理网站来完成。

那么,我如何注册同一型号的两个版本?并提供不同的名称以显示在管理索引中?

我所做的只是更改 ModelAdmin 类中的queryset,并将其注册两次,一次用于客户端,另一次用于合作伙伴,但它引起了我的兴趣 的 django.contrib.admin.sites.AlreadyRegistered

class ClientProfileInline(admin.StackedInline):
    model = ClientProfile
    can_delete = False
    verbose_name_plural = 'Client Profile'
    fk_name = 'user'


class ClientUserAdmin(UserAdmin):
    inlines = (ClientProfileInline, )

    def get_queryset(self, request):
        qs = super().get_queryset(request)
        return qs.filter(is_client=True)#HERE it is the flag for differentiating between Client and Partner

    def get_inline_instances(self, request, obj=None):
        if not obj:
            return list()
        return super(ClientUserAdmin, self).get_inline_instances(request, obj)

 ...as this with PartnerUserAdmin...

admin.site.register(User, PartnerUserAdmin)
admin.site.register(User, ClientUserAdmin)

1 个答案:

答案 0 :(得分:1)

我使用代理模型解决了这个问题,比如

class PartnerUser(User):
    class Meta:
        proxy = True
        verbose_name = 'Partner'


class ClientUser(User):
    class Meta:
        proxy = True
        verbose_name = 'Client'

admin.site.register(PartnerUser, PartnerUserAdmin)
admin.site.register(ClientUser, ClientUserAdmin)