以 Django ManyToMany 形式显示所有选项

Show all options in Django ManyToMany form

我有两个 Django 模型,通过 'through' 模型与 ManyToMany 关系连接:

class Tag(Model):
     uuid = UUIDField(auto=True, version=4, primary_key=True)
     name = CharField(max_length=100)

class Agent(Model):
    uuid = UUIDField(auto=True, version=4, primary_key=True)
    tags = ManyToManyField(
        'Tag', blank=True, null=True, through='AgentTag')

class AgentTag(Model):
    agent = ForeignKey(Agent)
    tag = ForeignKey(Tag)
    experience = IntegerField()

我想创建一个表格,显示标签模型中的所有标签,以及用于代理记录每个标签中 his/her 体验的下拉列表。如果用户以前更新过他们的体验,则应使用此初始化表单。保存表格应该更新 AgentTag "through" table.

我需要什么类型的表单(或表单集?)才能实现此目的?我不确定它应该是 AgentTag 的 ModelForm 还是定制的 Form。非常感谢有关如何解决此问题的帮助。

这里的 FormSet 似乎不必要的复杂,尽管可能只是我不习惯使用 formsets。

我想说在你看来你可以:

  1. 获取所有现有 Tag 的列表。
  2. 为每个 Tag 获取一个 AgentTag,如果缺少 [0],则创建一个。对于已经存在的,您将在他们的表格中预先填写经验。
  3. 迭代 AgentTag 秒,初始化一个 ModelForm ,每个 prefix

提交表单后,您的视图将迭代可用的 AgentTags,根据发布的数据为每个构建一个表单,并保存生成的对象。

您还可以考虑在用户修改体验下拉列表时使用来自客户端的异步 HTTP (AJAX) 请求更新体验,但这会稍微复杂一些,尽管您可以规避然后一起形成。

[0] 实际上,根据您的要求,您似乎可以在保存新 Agent 后立即为每个 Tag 创建一个 AgentTag 实例(空 AgentTag.experience,您必须将其设置为可空),但这并不重要。