django:在管理员中智能选择 ChainedForeignKey / 链式下拉菜单

Posted

技术标签:

【中文标题】django:在管理员中智能选择 ChainedForeignKey / 链式下拉菜单【英文标题】:django: smart-select ChainedForeignKey / chained dropdown in admin 【发布时间】:2021-12-24 19:13:33 【问题描述】:

嘿嘿! :)

我有 5 个模型彼此分层连接。 Section -> Division -> Group -> Class -> wz

一个分区可以有多个分区,但一个分区只能有一个分区(以此类推)。因此我设置了 ForeignKeys:

# models.py
class NaceSection(models.Model):
    code = models.CharField(max_length=1, unique=True)
    description_english = models.CharField(max_length=500)


class NaceDivision(models.Model):
    code = models.CharField(max_length=2, unique=True)
    nace_section = models.ForeignKey(NaceSection, on_delete=models.CASCADE, related_name="nace_section")
    description_english = models.CharField(max_length=500)


class NaceGroup(models.Model):
    nace_division = models.ForeignKey(NaceDivision, on_delete=models.CASCADE, related_name="nace_division")
    code = models.CharField(max_length=4, unique=True)
    description_english = models.CharField(max_length=500)

我有一个模型,其中所有这些都集成为带有下拉选项的 M2M 字段。 我的目标是只获取管理区域中已选择部分中的部门。 (等等)

我尝试了智能选择 ChainedForeignKey:

# models.py

class Institution(models.Model):
    nace_sections = models.ManyToManyField(
        NaceSection,
        related_name="nace_sections"
    )
    nace_divisions = ChainedForeignKey(
        NaceDivision,
        chained_field="nace_sections",
        chained_model_field='nace_sections',
        blank=True,
    )
     nace_group = ChainedForeignKey(
        NaceGroup,
        chained_field="nace_divisions",
        chained_model_field='nace_divisions',
        blank=True,
    )

管理区域中的组织和下拉菜单根本没有改变,我的所有结果表格的视图告诉我('42S22', "[42S22] [Microsoft][ODBC Driver 17 for SQL Server][SQL Server]Invalid column name 'nace_divisions_id'. (207) (SQLExecDirectW)")

使用 ChainedManyToManyField 什么都不会发生。有人知道出了什么问题吗? 任何帮助表示赞赏! :)

【问题讨论】:

你的错误不在于使用nace_divisions 作为chained_field 而不是nace_division 没有。如果我将其更改为 nace_section 和 nace_division,下拉菜单会显示管理员中的所有选项,并在保存错误 ('42S22', "[42S22] [Microsoft][ODBC Driver 17 for SQL Server][SQL Server]Invalid column name 'nace_divisions_id'. (207) (SQLExecDirectW); [42S22] [Microsoft][ODBC Driver 17 for SQL Server][SQL Server]Statement(s) could not be prepared. (8180)") 时出现。 【参考方案1】:

nace_sections 在您的代码中被指定为 models.ManyToManyField

1.从ManyToManyField改为ForeignKey。

2.重命名chained_model_field 值

-->nace_sections 到 nace_section -->nace_divisions 到 nace_division

class Institution(models.Model):
nace_sections = models.ForeignKey(
    NaceSection,
    related_name="nace_sections"
    , on_delete=models.CASCADE
)
nace_divisions = ChainedForeignKey(
    NaceDivision,
    chained_field="nace_sections",
    chained_model_field='nace_section',
    blank=True,
)
nace_group = ChainedForeignKey(
    NaceGroup,
    chained_field="nace_divisions",
    chained_model_field='nace_division',
    blank=True,
)
   

【讨论】:

我仍然收到错误,nace_sections_id、nace_divisions_id 等不存在。 你能发布你的确切错误信息吗?在迁移期间或打开管理页面时会出现在哪种情况下? 你也改变了这个:chained_model_field='nace_sections' ###Remove 's' here #### chained_model_field='nace_section', chained_model_field='nace_divisions', ### Remove 's'这里####chained_model_field='nace_division', ('42S22', "[42S22] [Microsoft][ODBC Driver 17 for SQL Server][SQL Server]Invalid column name 'nace_sections_id'. (207) (SQLExecDirectW); [42S22] [Microsoft][ODBC Driver 17 for SQL Server][SQL Server]Invalid column name 'nace_divisions_id'. (207); [42S22] [Microsoft][ODBC Driver 17 for SQL Server][SQL Server]Invalid column name 'nace_groups_id'. (207); 是的,我删除了“s”。

以上是关于django:在管理员中智能选择 ChainedForeignKey / 链式下拉菜单的主要内容,如果未能解决你的问题,请参考以下文章

当在另一个下拉列表上进行选择时,如何在 Django 的管理员中过滤下拉列表

Django Admin 下拉选择

在 django 中单击管理员的选择字段后如何隐藏或显示模型字段

django:使用管理员日期选择器

Django 管理中的多对多:选择无

如何在 Django Admin 中使用显示已选择和未选择的表单