显示Django ManyToMany形式的所有选项

时间:2015-07-26 01:02:29

标签: django django-forms

我有两个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还是定制表格。非常感谢如何处理这个问题。

1 个答案:

答案 0 :(得分:0)

FormSet在这里看似不必要,虽然可能只是我不习惯使用formset。

我会在你看来说你可以:

  1. 获取所有现有Tag的列表。
  2. 为每个AgentTag获取Tag,如果缺少[0]则创建。对于那些已经存在的人,你将获得预先填写表格的经验。
  3. AgentTag进行迭代,为每个ModelForm 初始化AgentTag
  4. 提交表单后,您的视图将遍历可用的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) <,你必须使其可以为空),但这并不重要。