显示Django ManyToMany形式的所有选项

我有两个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()

我想创建一个表单,显示Tag模型中的所有标签,以及代理的下拉列表,以记录他/她在每个标签中的体验 . 如果用户之前已更新过他们的经验,则应使用此初始化表单 . 保存表单应更新AgentTag“通过”表 .

我需要什么类型的表单(或表单集?)来实现这一目标?我不确定它应该是AgentTag的ModelForm还是定制的Form . 非常感谢有关如何处理此问题的一些帮助 .

回答(1)

2 years ago

FormSet在这里似乎不必要复杂,尽管可能只是我不习惯使用formset .

我会在你看来说你可以:

  • 获取所有现有 Tag 的列表 .

  • 为每个 Tag 获取一个 AgentTag ,如果缺少[0]则创建 . 对于那些已经存在的人,你将拥有预先填写表格的经验 .

  • 迭代 AgentTag s,为每个 ModelForm 初始化一个 ModelForm .

提交表单时,您的视图将遍历可用的 AgentTag ,根据POSTed数据为每个表单构造一个表单,并保存生成的对象 .

每当用户修改体验下拉列表时,您也可以考虑使用来自客户端的异步HTTP(AJAX)请求更新体验,但这可能会稍微复杂一些,尽管您可能完全避开表单 .

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