adrian oviedo
adrian oviedo

Reputation: 684

django admin for multiple user types

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

Answers (1)

adrian oviedo
adrian oviedo

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

Related Questions