如何在django admin中自定义表单值,以仅显示分配给他/她的值?

如何在django admin中自定义表单值,以仅显示分配给他/她的值?,django,django-models,django-admin,django-forms,Django,Django Models,Django Admin,Django Forms,我在django admin应用程序中实现了行级权限。我有三个模型,分别是: 课程--{标题,代码} 单元--{课程名称(外键)} 主题--{标题,单位(外键)} 注:(上面粗体字是模型名称,大括号中的值是每个模型的字段) 每个用户都有权添加/编辑/删除分配给他的特定课程。我正在使用def queryset(self,request):方法检查哪个用户对哪些课程有权限,然后返回包含这些课程的queryset。通过这种方式,我能够显示分配给他/她的用户特定课程 一门课程可以有许多单元,而且一个单元

我在django admin应用程序中实现了行级权限。我有三个模型,分别是:

  • 课程--{标题,代码}

  • 单元--{课程名称(外键)}

  • 主题--{标题,单位(外键)}
  • 注:(上面粗体字是模型名称,大括号中的值是每个模型的字段)

    每个用户都有权添加/编辑/删除分配给他的特定课程。我正在使用
    def queryset(self,request):
    方法检查哪个用户对哪些课程有权限,然后返回包含这些课程的queryset。通过这种方式,我能够显示分配给他/她的用户特定课程

    一门课程可以有许多单元,而且一个单元可以有许多主题。这是一个层次结构

    因此,我再次使用相同的
    def queryset(self,request):
    筛选单元和主题,以仅显示分配给他/她的课程下的单元和主题。到目前为止,一切都很顺利,用户只能看到与他/她的课程相关的单元主题。但当用户试图编辑单元时,会出现一个表单,其中包含两个字段:

  • 标题(他可以重命名的单元标题)
  • 课程(他可以从中选择任何人/外键的所有课程的下拉列表)
  • 在第二个字段“课程”下拉列表中,我只希望用户能够看到分配给他/她的课程。这样,他/她就无法使用未分配给他的任何其他课程更新单元

    在编辑主题时,用户可以在下拉字段中看到所有单位,并可以为主题选择任何单位


    我想我需要覆盖一些视图或做一些魔术,但找不到。

    您可能应该覆盖
    ModelAdmin
    Unit
    formfield\u for\u foreignkey
    方法,以便根据请求更改查询集。类似于(未经测试):

    你可以用

    示例代码

    from django.db import models
    from smart_selects.db_fields import ChainedForeignKey
    
    class Continent(models.Model):
        name = models.CharField(max_length=100)
        def __unicode__(self):
            return self.name
    
    class Country(models.Model):
        name=models.CharField(max_length=100)
        continent=models.ForeignKey(Continent)
        def __unicode__(self):
            return self.name
    
    class Area(models.Model):
        name=models.CharField(max_length=100)
        country=models.ForeignKey(Country)
        def __unicode__(self):
            return self.name
    
    class Location(models.Model):
        continent = models.ForeignKey(Continent)
        country = ChainedForeignKey(
            Country, 
            chained_field="continent",
            chained_model_field="continent", 
            show_all=False, 
            auto_choose=True
        )
        area = ChainedForeignKey(Area, chained_field="country", chained_model_field="country")
        city = models.CharField(max_length=50)
        street = models.CharField(max_length=100)
    
        def get_products(self):
            return ','.join([p.name for p in self.area.all()])
    
    from smart_selects.db_fields import ChainedForeignKey
    
    from django.db import models
    from smart_selects.db_fields import ChainedForeignKey
    
    class Continent(models.Model):
        name = models.CharField(max_length=100)
        def __unicode__(self):
            return self.name
    
    class Country(models.Model):
        name=models.CharField(max_length=100)
        continent=models.ForeignKey(Continent)
        def __unicode__(self):
            return self.name
    
    class Area(models.Model):
        name=models.CharField(max_length=100)
        country=models.ForeignKey(Country)
        def __unicode__(self):
            return self.name
    
    class Location(models.Model):
        continent = models.ForeignKey(Continent)
        country = ChainedForeignKey(
            Country, 
            chained_field="continent",
            chained_model_field="continent", 
            show_all=False, 
            auto_choose=True
        )
        area = ChainedForeignKey(Area, chained_field="country", chained_model_field="country")
        city = models.CharField(max_length=50)
        street = models.CharField(max_length=100)
    
        def get_products(self):
            return ','.join([p.name for p in self.area.all()])