django管理员内联字段选项基于主表单字段值进行过滤

问题描述

我有以下型号:

class Organizations(models.Model):
    name = models.CharField(max_length=30,unique=True)

class Postcodes(models.Model):
    organization = models.ForeignKey(Organizations,on_delete=models.PROTECT)
    postcode = models.PositiveBigIntegerField()

class Agent(models.Model):
    organization = models.ForeignKey(Organizations,on_delete=models.PROTECT)
    name = models.CharField(max_length=50)

class AgentPostcodes(models.Model):
    agent= models.ForeignKey(Agent,on_delete=models.PROTECT)
    postcode = models.ForeignKey(Postcodes,on_delete=models.PROTECT)

而admin.py是

class AgentPostcodesInline(admin.TabularInline):
    model = AgentPostcodes

class AgentAdmin(admin.ModelAdmin):
    list_display = ['organization','name']
    inlines = [AgentPostcodesInline]    

如何仅根据与该组织相关的邮政编码来根据组织过滤内联表单字段。 目前,它会显示所有与代理无关的组织的邮政编码。

解决方法

覆盖TabularInlineInlineModelAdminget_queryset方法,类似于documentation中描述的方法:

ModelAdmin.get_queryset(request)

ModelAdmin的get_queryset方法返回所有的QuerySet 可以由管理站点编辑的模型实例。一个用例 重写此方法是为了显示登录用户拥有的对象:

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)