简体   繁体   中英

Django admin view limiting the selection of items from foreign key according to user

I am writing code in Django for Engineering College:

1) College has Engineering Branches like Computer Engg, Mech Engg, Chemical Engg.

2) Now each Branch will have different classes like for Frst year enginnering in computer has to classes say, FYCO1 and FYCO2

3) I have created different users for each head of the department(HOD) and following models:

class M_Branch(models.Model):
Branch_ID = models.CharField(max_length=20)   
Branch_Name= models.CharField(max_length=50)
def __str__(self):
    return self.Branch_Name

class M_Academic_year(models.Model):
Academic_year = models.CharField(max_length=20)
def __str__(self):
    return self.Academic_year


class M_Class(models.Model):
Branch_ID = models.ForeignKey(M_Branch)
Academic_Year = models.ForeignKey(M_Academic_year)
Class_ID = models.CharField(max_length=20)
Class_Name = models.CharField(max_length=20)
def __str__(self):
    return self.Class_Name

4) Now each HOD (user) must be able to add a class for only his own department(branch),HOW TO ACHIEVE THIS FUNCTIONALITY???

Note: I have not written any views,(and don't want to do so). I am using Django's default admin view

To read only branch of HOD in M_ClassAdmin first make a relation between HOD and Branch For this, make changes In Model.py as

from django.contrib.auth.models import User

Add Hod Field as

 HOD = models.ForeignKey(User)

to store HOD and Branch relation

Now Model.py willbe...

class M_Branch(models.Model):
    HOD = models.ForeignKey(User)
    Branch_ID = models.CharField(max_length=20)   
    Branch_Name= models.CharField(max_length=50)
    def __str__(self):
         return self.Branch_Name

class M_Academic_year(models.Model):
      Academic_year = models.CharField(max_length=20)
      def __str__(self):
            return self.Academic_year

class M_Class(models.Model):
     Branch_ID = models.ForeignKey(M_Branch)
     Academic_Year = models.ForeignKey(M_Academic_year)
     Class_ID = models.CharField(max_length=20)
     Class_Name = models.CharField(max_length=20)
     def __str__(self):
           return self.Class_Name

Then in admin.py Override get_queryset and formfield_for_foreignkey

class M_ClassAdmin(admin.ModelAdmin):
    def get_queryset(self, request):
       print("Query SET")
       qs = super(M_ClassAdmin, self).get_queryset(request)
       if request.user.is_superuser:
           return qs
       user = User.objects.get(username=request.user.username)
       branch = M_Branch.objects.get(HOD = user)
       print("Branch_ID_id",branch)
       return qs.filter(Branch_ID_id=branch)
    def formfield_for_foreignkey(self, db_field, request, **kwargs):
    print("I am in func::")
    if db_field.name == "Branch_ID":
        print("db_field.name",db_field.name)
        user = User.objects.get(username=request.user.username)

        if not user.is_superuser:
            print('user=',user)
            branch = M_Branch.objects.get(HOD = user)
            print('branch = ',branch)
            '''if user=='E0711001':
                kwargs["queryset"] = M_Branch.objects.filter(Branch_ID='B101')
            #elif user=='E0711002':
            else:
                kwargs["queryset"] = M_Branch.objects.filter(Branch_ID='B102')'''
            #kwargs["queryset"] = M_Branch.objects.filter(Branch_ID=user.branch.id)
            kwargs["queryset"] = M_Branch.objects.filter(Branch_Name=branch)

    return super(M_ClassAdmin, self).formfield_for_foreignkey(db_field, request, **kwargs)


fields = ['Branch_ID','Academic_Year','Class_Name']
list_filter = ['Academic_Year','Class_Name']
search_fields = ['Branch_ID','Academic_Year','Class_Name']
list_display = ('Class_Name','Branch_ID','Academic_Year')
admin.site.register(M_Class,M_ClassAdmin)

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM