芯/ 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 = Person,则自动创建Entity.is_person = True的实体。然后,实体可以通过成员模型中的ManyToMany关系成为“员工”,“供应商”和“客户”等组的成员。
如何在管理视图中过滤Membership.entity(用于添加和更新)当选择的组是'is_individual = True'时,例如'Employee',实体字段仅显示'is_person = True'实体组合框?
答案 0 :(得分:2)
我会考虑为此编写自己的观点。在我看来,Djangos管理员不是一个基于前端的好网站。我只使用它来进行快速更改,因为管理员的用户应该知道他们正在做什么,因此无需进行验证。当你开始添加更多响应性的东西时,那就是当我考虑使用另一个视图并从头开始(或框架)但从不同的视图开始时。
答案 1 :(得分:1)
对于你想要的内容,有几个不同的名称:依赖下拉列表,链接字段等.Django本身没有任何开箱即用的东西。
您的两个选项是:(1)自己动手或(2)使用第三方包裹。
就你自己而言,你需要在JS中做一些工作才能使它在前端工作,你可能需要一些输出JSON数据的灵活视图,以及你将需要某种自定义选择字段来处理这个问题。
对于使用第三方软件包,我没有看到任何特别近期的内容。这是一个几岁的人:https://github.com/runekaagaard/django-admin-flexselect
希望这会有所帮助!