【问题标题】:Django admin view limiting the selection of items from foreign key according to userDjango 管理视图根据用户限制从外键中选择项目
【发布时间】:2015-07-04 00:45:52
【问题描述】:

我正在为工程学院用 Django 编写代码:

1) 学院设有计算机工程、机械工程、化学工程等工程分支。

2) 现在每个分支都会有不同的课程,比如第一年的计算机工程到课程,比如 FYCO1 和 FYCO2

3)我为每个部门负责人(HOD)和以下模型创建了不同的用户:

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)现在每个HOD(用户)必须能够为自己的部门(分支)添加一个类,如何实现这个功能???

注意:我没有写任何观点,(也不想这样做)。我正在使用 Django 的默认管理员 查看

【问题讨论】:

  • 您想在视图或模型中实现这一点?
  • 我正在使用 django admin 添加类.....当我以 Computer Engg 的 HOD 身份登录时。外键,分支,必须只显示 Computer Engg 的一个选项,而不是所有分支......因为 HOD Comp Engg 关心的是他自己的部门而不是所有部门......知道了吗??

标签: python django admin


【解决方案1】:

要在 M_ClassAdmin 中只读 HOD 的分支,首先在 HOD 和 Branch 之间建立关系为此,在 Model.py 中进行更改为

from django.contrib.auth.models import User

添加 Hod 字段为

 HOD = models.ForeignKey(User)

存储HOD和Branch关系

现在 Model.py 将...

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

然后在 admin.py 中覆盖 get_queryset 和 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)

【讨论】:

    猜你喜欢
    • 2021-12-24
    • 2018-10-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-09-18
    • 2017-05-03
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多