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.
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.