首页 > 解决方案 > Django 管理员 | 根据外键关系选择过滤多对多下拉列表

问题描述

我试图找出在具有多对多关系的模型上在 Django Admin 中水平过滤的最佳方法。目标是在 Inline 部分中,当填充一个下拉列表时,将过滤它旁边与第一个下拉列表具有外键关系的下拉列表。

有 TypeSets 和 TypeValues,一个 TypeSet 有很多 TypeValues例如。如果 TypeSet 的类型是“wood”,TypeValue 类型将是 ["oak", "cherry", "walnut"]

然后这些 TypeValues 与“Thing”(以及包含的 TypeSet_id)形成多对多关系

目标是在 Django Admin 中的 ThingTypeInline 创建新事物时,我可以从下拉列表中选择 TypeSet,然后过滤掉它旁边的 TypeValue 下拉列表。

这会是自定义表格吗?

楷模:

class TypeSet(models.Model):
    """TypeSet to be used to describe data type"""
    id = models.UUIDField(primary_key=True, default=uuid.uuid4, editable=False)
    type = models.CharField(max_length=255, unique=True)
    .....


class TypeValue(models.Model):
    """TypeValue to be used to describe value in the TypeSet"""
    id = models.UUIDField(primary_key=True, default=uuid.uuid4, editable=False)
    type = models.CharField(max_length=255)
    type_set = models.ForeignKey(
        TypeSet,
        on_delete=models.CASCADE
    )
    .......

class Thing(models.Model):
    id = models.UUIDField(primary_key=True, default=uuid.uuid4, editable=False)
    types = models.ManyToManyField(
        TypeValue, through='ThingType')
   ..........

class ThingType(models.Model):
    id = models.UUIDField(primary_key=True, default=uuid.uuid4, editable=False)
    thing = models.ForeignKey(Locale, on_delete=models.CASCADE)
    type_set = models.ForeignKey(TypeSet, on_delete=models.CASCADE)
    type_value = models.ForeignKey(TypeValue, on_delete=models.CASCADE)
    .......

行政:

class ThingTypeInline(admin.TabularInline):
    model = models.ThingType


class ThingAdmin(admin.ModelAdmin):
    inlines = [
        LocaleTypeInline,
    ]

标签: djangodjango-admin

解决方案


推荐阅读