【问题标题】:Django Admin: Add <select multiple> to the *other* model in a many-to-many relationshipDjango Admin:以多对多关系将 <select multiple> 添加到 *other* 模型
【发布时间】:2012-11-20 13:35:04
【问题描述】:

我的应用程序中有ToolsTasks 之间的多对多关系。现在,在Task 模型上定义了多对多关系,因此在管理员的Task 编辑页面中,我有一个&lt;select multiple&gt; 控件,允许您选择0 个或多个Tools 进行关联与Task

我知道 Django 不允许您在两个模型上定义关系,但是否仍然可以告诉管理员在 Tool 编辑页面上也包含 &lt;select multiple&gt;?我希望能够从它的任一侧编辑关系。

【问题讨论】:

  • 您可以编辑管理表单(集)并扩展保存方法吗? select multiple 只是一个小部件,没什么特别的

标签: python django django-admin


【解决方案1】:

这样的东西应该可以工作(给定 m2m 在Tool 中指定):

# 1st app
from secondapp.models import Tool

class Task(models.Model):
    tools = models.ManyToManyField(Tool, through=Tool.tasks.through)

# 2nd app
class Tool(models.Model):
    tasks = models.ManyToManyField("firstapp.Task")

【讨论】:

  • 我的两个模型在两个不同的应用程序中,那么您将如何避免循环导入呢? (顺便说一句,它是任务和工具,而不是标签和工具。)
  • 我更新了答案以处理不同的应用程序和命名:) 没有尝试,但我认为这应该可行。
  • 这是个好主意,但对我不起作用。 m2m 是在 Task 中定义的,按照您的逻辑,这意味着我应该将 app1.Task 的导入移到 app2.models 中。但是,app1 在其他地方也引用了 app2.Tool,因此我无法按照您的建议移动导入。
【解决方案2】:

您可以尝试在ToolsTasks 之间创建一个充当中介的虚拟模型,这是 Django 通常提供的,用于存储有关特定关系的额外信息。在创建此 ManyToMany 关系时,您将使用 through= 关键字来利用它。

您可以找到有关该here 的详细信息。

我实际上并没有在管理页面上查看它,但我想一旦你在管理页面上注册模型,因为该模型与 each 具有ForeignKey 关系ToolsTasks 之间的关系,您应该可以从虚拟模型编辑两侧的关系。

不过,我不一定会推荐这个,除非你能够访问双方的关系是非常必要的。

【讨论】:

    【解决方案3】:

    我不会使用through 或使您的模型复杂化只是为了让管理员看起来不错。您也可以尝试creating an admin inline。使用内联,您可以在管理应用程序中向任何模型的屏幕添加小节。文档中有一些很好的例子。

    【讨论】:

      猜你喜欢
      • 2018-04-04
      • 1970-01-01
      • 2019-09-05
      • 2019-05-09
      • 2012-10-20
      • 1970-01-01
      • 2021-06-05
      • 2011-02-22
      • 2018-01-04
      相关资源
      最近更新 更多