我有一个处理多种用户类型的应用。我需要一种方法来区分管理站点中的它们。一些代码来说明。
首先,我创建了一个 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)
答案 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)