Reputation: 684
I've an app that deals with multiple user types. I need a way for differentiating them in the admin site. Some code to illustrate.
First I created a User model class that inherits from AbstractUser
class User(AbstractUser):
is_partner = models.BooleanField(default=False)
is_client = models.BooleanField(default=False)
email = models.EmailField(unique=True)
Partners and Clients users has different data:
class ClientProfile(models.Model):
user = models.OneToOneField(User, on_delete=models.CASCADE)
...
class PartnerProfile(models.Model):
user = models.OneToOneField(User, on_delete=models.CASCADE)
...
Client profile is created through SignUp form I provide, after that, users can update their own profile. In the other hand, Partner profile is created by myself as admin, and I need to do it through django admin site.
So, how do I register two version of the same model? and provide different names for showing in the admin index?
What I did was to change just the queryset
in the ModelAdmin class, and register it twice, one for Client and another for Partner but it raises me
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)
Upvotes: 1
Views: 2304
Reputation: 684
I resolved it using Proxy models, like this
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)
Upvotes: 4