I.Jokhadze
I.Jokhadze

Reputation: 477

Django exclude field in admin if creator of this object is request user

How can I exclude a field from the Django admin if the creator of this object is current user. Is there any way to customise my model in admin.py?

class Toys(BaseModel):
    name = models.CharField(max_length=255)
    tags = models.ManyToManyField(Tag, related_name='Item_tags')
    price = models.CharField(max_length=255)
    status = models.BooleanField(default=False)

Upvotes: 2

Views: 2607

Answers (1)

Alasdair
Alasdair

Reputation: 308999

First, you need to add a field to your model to store the creator.

class Toys(BaseModel):
    creator = models.ForeignKey(User, on_delete=models.CASCADE)
    name = models.CharField(max_length=255)
    tags = models.ManyToManyField(Tag, related_name='Item_tags')
    price = models.CharField(max_length=255)
    status = models.BooleanField(default=False)

The override the get_fields method of your model admin.

class ToyAdmin(admin.ModelAdmin):
    def get_fields(self, request, obj=None):
        fields = super(ToyAdmin, self).get_fields(request, obj)
        if obj is not None and request.user.is_authenticated():  # In Django 1.10+ use request.user.is_authenticated
            if obj.creator == request.user:
            fields = [f for f in fields if f != 'status']
        return fields

In Django 1.11+, you can use get_exclude instead.

class ToyAdmin(admin.ModelAdmin):
    def get_exclude(self, request, obj=None):
        if obj is not None and request.user.is_authenticated():  # In Django 1.10+ use request.user.is_authenticated
            if obj.creator == request.user:
                return ['status']
        else:
            return []

Upvotes: 2

Related Questions