Необходимо ограничить доступ для просмотра только введенных или назначенных данных в админке django

Модель пользователя

class User(models.Model):
    
    
    BLOOD_GROUP_CHOICES = (
        
        ('a+','A+'),
        ('a-','A-'),
        ('b+','B+'),
        ('b-','B-'),
        ('ab+','AB+'),
        ('ab-','AB-'),
        ('o+','O+'),
        ('o-','O-')
        
    )
    
    
    BILLABLE_and_NON_BILLABLE_CHOICES=(
        
        
        ('Billable','Billable'),
        ('Non-Billable','Non-Billable')
    )



    employee_name = models.OneToOneField(Default_User,on_delete=CASCADE)
    dob=models.DateField(max_length=8) 
    email=models.EmailField(max_length=25,default=None)
    pancard=models.CharField(max_length=25,default=None)
    aadhar=models.CharField(max_length=20,default=None)
    personal_email_id=models.EmailField(max_length=254,default=None)
    phone = PhoneNumberField()
    emergency_contact_no=models.IntegerField(default=None)
    emergency_contact_name=models.CharField(max_length=100,null=True)
    relation=models.CharField(max_length=25,default=None)
    blood_group=models.CharField(max_length=25,choices=BLOOD_GROUP_CHOICES,null=True)  
    designation=models.ForeignKey(Designation,on_delete=CASCADE,related_name="designation")
    billable_and_non_billable=models.CharField(max_length=25,choices=BILLABLE_and_NON_BILLABLE_CHOICES,default='Billable')
    joining_date=models.DateField(max_length=15,null=True)
    relieving_date=models.DateField(max_length=15,null=True)
    
    class Meta:
        db_table ='User'
        
        
    def __str__(self):
        return str(self.id)

Модель работы

class Job(models.Model):
    
    job_name=models.CharField(max_length=50)
    client=models.ForeignKey(Client,on_delete=CASCADE,related_name='client',default=None)
    #project=models.ForeignKey(Project,on_delete=CASCADE,related_name='project',default=None)
    project = ChainedForeignKey(Project,chained_field="client", chained_model_field="client",show_all=False, auto_choose=True, sort=True)
    user=models.ForeignKey(User,on_delete=CASCADE,related_name='user',default=None)
    hours=models.TimeField(null=True)
    start_date = models.DateTimeField(max_length=10)
    end_date=models.DateTimeField(max_length=10)
    
    class Meta:
        
        db_table ='Job'
    
    def __str__(self):
        return '{} {}'.format(str(self.id), self.job_name)

admin.py

class StaffAdmin(admin.ModelAdmin):

    '''def get_queryset(self, request):
        qs = super().get_queryset(request)

        print(f"\nrequest.user : {request.user}\n")

        if request.user.is_superuser:
            return qs

        return qs.filter(user__id=request.user.id)'''

    def get_queryset(self, request):
        qs = super().get_queryset(request)
        user = request.user
        
        if user.is_superuser:
            return qs 
            
        return qs.filter(user_id=request.user.id)

пользовательская модель

class Default_User(AbstractBaseUser, PermissionsMixin):
    username = models.CharField(max_length=30, unique=True)
    email = models.EmailField(max_length=250, unique=True)
    first_name = models.CharField(max_length=30, blank=True, null=True)
    last_name = models.CharField(max_length=30, blank=True, null=True)
    is_active = models.BooleanField(default=True)
    is_staff = models.BooleanField(default=True)
    is_superuser = models.BooleanField(default=False)
    date_joined = models.DateTimeField(default=timezone.now)


    objects = UserManager()

    USERNAME_FIELD = 'username'
    REQUIRED_FIELDS = ['email', ]

Я дал привилегию для пользователей персонала просматривать, редактировать и удалять Job API, но мне нужно ограничить просмотр только их заданий, назначенных этим пользователям, и редактировать и удалять задания, которые пользователь добавил. Но в приведенном выше коде я не смог этого сделать, так как он не показывает задания, которые назначены суперпользователем конкретному пользователю. Пожалуйста, помогите решить эту проблему, так как я новичок в django и застрял на этом методе.

Если вы используете пользовательский класс ModelAdmin, вам необходимо зарегистрировать его в модели, к которой вы хотите его применить. Класс ModelAdmin - это представление модели в интерфейсе администратора.

from django.contrib import admin
from myapp.models import Job

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

admin.site.register(Job, JobModelAdmin)
Вернуться на верх