以 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。
我想说在你看来你可以:
- 获取所有现有
Tag
的列表。
- 为每个
Tag
获取一个 AgentTag
,如果缺少 [0],则创建一个。对于已经存在的,您将在他们的表格中预先填写经验。
- 迭代
AgentTag
秒,初始化一个 ModelForm
,每个 prefix
。
提交表单后,您的视图将迭代可用的 AgentTag
s,根据发布的数据为每个构建一个表单,并保存生成的对象。
您还可以考虑在用户修改体验下拉列表时使用来自客户端的异步 HTTP (AJAX) 请求更新体验,但这会稍微复杂一些,尽管您可以规避然后一起形成。
[0] 实际上,根据您的要求,您似乎可以在保存新 Agent
后立即为每个 Tag
创建一个 AgentTag
实例(空 AgentTag.experience
,您必须将其设置为可空),但这并不重要。
我有两个 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。
我想说在你看来你可以:
- 获取所有现有
Tag
的列表。 - 为每个
Tag
获取一个AgentTag
,如果缺少 [0],则创建一个。对于已经存在的,您将在他们的表格中预先填写经验。 - 迭代
AgentTag
秒,初始化一个ModelForm
,每个prefix
。
提交表单后,您的视图将迭代可用的 AgentTag
s,根据发布的数据为每个构建一个表单,并保存生成的对象。
您还可以考虑在用户修改体验下拉列表时使用来自客户端的异步 HTTP (AJAX) 请求更新体验,但这会稍微复杂一些,尽管您可以规避然后一起形成。
[0] 实际上,根据您的要求,您似乎可以在保存新 Agent
后立即为每个 Tag
创建一个 AgentTag
实例(空 AgentTag.experience
,您必须将其设置为可空),但这并不重要。