Django:如何在管理详细信息视图中过滤外键

Django: How to filter foreign key in admin detail view

core/models.py

from django.db import models
from django.db.models.signals import post_save

class Person(models.Model):
    first_name = models.CharField(max_length=30)
    last_name = models.CharField(max_length=30)
    middle_name = models.CharField(max_length=30)

class Company(models.Model):
    name = models.CharField(max_length=100)


class Entity(models.Model):
    is_person = models.BooleanField(default=True)
    person = models.ForeignKey(Person, on_delete=models.PROTECT, null=True)
    company = models.ForeignKey(Company, on_delete=models.PROTECT, null=True)    
    name = models.CharField(max_length=30)

    def __str__(self):
        return self.name

    @property
    def title(self):
        return self.name

    class Meta:
        verbose_name_plural = 'entities'

def post_save_person_receiver(sender, instance, created, *args, **kwargs):
    if created:
        entity, is_created = Entity.objects.get_or_create(is_person=True, person=instance, company=None, name=instance.last_name) # noqa

post_save.connect(post_save_person_receiver, sender=Person)

def post_save_company_receiver(sender, instance, created, *args, **kwargs):
    if created:
        entity, is_created = Entity.objects.get_or_create(is_person=False, person=None, company=instance, name=instance.short_name) # noqa

post_save.connect(post_save_company_receiver, sender=Company)

class Group(models.Model):
    name = models.CharField(max_length=20)
    is_individual = models.BooleanField(default=True)
    members = models.ManyToManyField(Entity, through='Membership')

class Membership(models.Model):
    group = models.ForeignKey(Group, on_delete=models.PROTECT, null=False)
    entity = models.ForeignKey(Entity, on_delete=models.PROTECT, null=False)
    class Meta:
        unique_together = ("entity", "group")

对于创建的每个公司和个人,都会自动创建一个实体,其中 Entity.is_person=True 如果是个人。然后,实体可以通过成员资格模型中的 ManyToMany 关系成为 'Employee'、'Supplier' 和 'Customer' 等组的成员。

How do I filter Membership.entity in Admin View (for add and update) that when the Group selected is an 'is_individual=True', such as 'Employee', Entity Field only shows 'is_person=True' 实体组合框中的人?

Admin View

有几个不同的名称可以表示您想要的名称:依赖下拉菜单、链接字段等。Django 本身没有任何开箱即用的东西。

您的 2 个选择是:(1) 自己动手或 (2) 使用第三方软件包。

就您自己而言,您将需要在 JS 中做一些工作以使其在前端运行,并且您可能需要某种灵活的视图来输出 JSON 数据,你将需要某种自定义 select 字段来处理它。

对于使用 3rd 方包,我没有看到任何特别最近的东西。这是几年前的:https://github.com/runekaagaard/django-admin-flexselect

希望这对一些人有所帮助!

我会考虑为此写下你自己的看法。在我看来,Djangos admin 不是一个基于前端的好站点。我只用它来进行快速更改,因为不需要进行太多验证,因为管理员的用户应该知道他们在做什么。当你开始添加更多响应性的东西时,就是我考虑使用另一个视图并从头开始(或框架)但不同的视图 none-the-less.