我有两个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 回答
FormSet在这里似乎不必要复杂,尽管可能只是我不习惯使用formset .
我会在你看来说你可以:
获取所有现有
Tag
的列表 .为每个
Tag
获取一个AgentTag
,如果缺少[0]则创建 . 对于那些已经存在的人,你将拥有预先填写表格的经验 .迭代
AgentTag
s,为每个ModelForm
初始化一个ModelForm
.提交表单时,您的视图将遍历可用的
AgentTag
,根据POSTed数据为每个表单构造一个表单,并保存生成的对象 .每当用户修改体验下拉列表时,您也可以考虑使用来自客户端的异步HTTP(AJAX)请求更新体验,但这可能会稍微复杂一些,尽管您可能完全避开表单 .
[0]实际上,根据您的要求,似乎您可以在保存新的
Agent
时为每个Tag
创建AgentTag
实例(空AgentTag.experience
,您必须使其可以为空),但这并不重要 .