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

时间:2018-04-03 16:41:24

标签: django admin

芯/ 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'实体组合框?

Admin View

2 个答案:

答案 0 :(得分:2)

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

答案 1 :(得分:1)

对于你想要的内容,有几个不同的名称:依赖下拉列表,链接字段等.Django本身没有任何开箱即用的东西。

您的两个选项是:(1)自己动手或(2)使用第三方包裹。

就你自己而言,你需要在JS中做一些工作才能使它在前端工作,你可能需要一些输出JSON数据的灵活视图,以及你将需要某种自定义选择字段来处理这个问题。

对于使用第三方软件包,我没有看到任何特别近期的内容。这是一个几岁的人:https://github.com/runekaagaard/django-admin-flexselect

希望这会有所帮助!