user1619524
user1619524

Reputation: 1624

Django admin : show records for respective user only

I have a simple model, say Resources. And I have fewer than 20 users and model admin serves the purpose to record requests.

Problem is that all users can see all records in model admin site.

Can this behaviour be changed to only show records created by same user only ?

Thank you in anticipation.

Upvotes: 6

Views: 6548

Answers (2)

Azmol
Azmol

Reputation: 477

UPDATE 2020: Anyone who is curious as to what is the author field, then that is established in the models.py file of your app. For the admin.py part, you can visit the docs.

Step 1:

Make sure in your permissions you give access to the apps you want your users to have CRUD functionality over.

Step 2:

Admin.py

class MyModelAdmin(admin.ModelAdmin):
    def get_queryset(self, request):
        qs = super().get_queryset(request)
        if request.user.is_superuser:
            return qs
        return qs.filter(author=request.user)

Models.py

from django.contrib.auth import get_user_model

class Lecture(models.Model):
    author = models.ForeignKey(get_user_model(), null=True, on_delete=models.CASCADE)

Upvotes: 3

mimo
mimo

Reputation: 2629

The django doc has an example that does almost exactly what you want:

https://docs.djangoproject.com/en/1.11/ref/contrib/admin/#django.contrib.admin.ModelAdmin.get_queryset

The idea is to override the get_queryset() method in the model admin view:

# admin.py
from django.contrib import admin

class YourModelAdmin(admin.ModelAdmin):
    def get_queryset(self, request):
        qs = super(MyModelAdmin, self).get_queryset(request)
        return qs.filter(author=request.user)

admin.site.register(YourModel, YourModelAdmin)

You can adapt the queryset filter to even more specific needs at will.

Upvotes: 10

Related Questions