我有两个Django模型,通过'通过'连接到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()
我想创建一个表单,显示标记模型中的所有标记,以及代理的下拉列表,以记录他/她在每个标记中的体验。如果用户之前已更新过他们的经验,则应使用此初始化表单。保存表单应该更新AgentTag"通过"表
我需要什么类型的表单(或表单集?)来实现这一目标?我不确定它应该是AgentTag的ModelForm还是定制表格。非常感谢如何处理这个问题。
答案 0 :(得分:0)
FormSet在这里看似不必要,虽然可能只是我不习惯使用formset。
我会在你看来说你可以:
Tag
的列表。AgentTag
获取Tag
,如果缺少[0]则创建。对于那些已经存在的人,你将获得预先填写表格的经验。AgentTag
进行迭代,为每个ModelForm
初始化AgentTag
。提交表单后,您的视图将遍历可用的AgentTag
,根据POSTed数据为每个表单构建一个表单,并保存生成的对象。
每当用户修改体验下拉列表时,您也可以考虑使用来自客户端的异步HTTP(AJAX)请求更新体验,但这会更复杂一些,尽管您可能会完全避开表单。
[0]实际上,根据您的要求,您似乎可以在保存新Tag
时为每个Agent
创建AgentTag.experience
个实例(空var http = require('http').Server
var socketIO = require('socket.io')
var socketIOClient = require('socket.io-client')
var port = 3000
var url = 'ws://localhost:' + port
function newServer(serverName, cb)
{
var server = http().listen(port, function()
{
console.log(serverName, 'listening')
var io = socketIO(server)
var clientSocket = socketIOClient(url,
{
reconnection: false,
//////////////////////////////
// this forces a new connection!
forceNew: true
//////////////////////////////
})
clientSocket.on('connect', function()
{
// never get 'two connect'
console.log(serverName, 'connect')
io.close()
})
clientSocket.on('disconnect', function()
{
console.log(serverName, 'disconnect')
cb()
})
})
}
function startServerOne(cb)
{
newServer('one', cb)
}
function startServerTwo()
{
newServer('two', function()
{
console.log('high five everyone')
})
}
startServerOne(startServerTwo)
<,你必须使其可以为空),但这并不重要。