Django ModelForm 保存 ManyToManyField 问题

0 投票
1 回答
518 浏览
提问于 2025-04-16 08:19

我刚开始学习Django,遇到了一个视图错误,需要一些帮助。

我写了一个视图,如果请求方式是GET,就显示一个“组”的数据表;如果请求方式是POST,就显示一个表单,用来编辑特定的“组”(要编辑的项目通过POST数据传递过来)。

另外,如果是对一个已有的项目进行POST操作,我希望表单能自动填充我在表格中已经有的数据。基本上我都搞定了,但在我尝试保存编辑后的表单时,总是出现这个错误:

“无法在指定中介模型的ManyToManyField上设置值”

任何帮助都将非常感谢。另外,我对这些网页开发的东西还很陌生,所以如果我做了什么完全傻的事情或者遗漏了什么概念,请随便批评我。;-)

模型

class Alias(models.Model):
    def __unicode__(self):
        return unicode(self.alias)
    alias = models.CharField(max_length=32)

class Octet(models.Model):
    def __unicode__(self):
        return unicode(self.num)
    num = models.IntegerField(max_length=3)

class Group(models.Model):
    def __unicode__(self):
        return unicode(self.name)
    name = models.CharField(max_length=32) #name of the group
    id = models.AutoField(primary_key=True) #primary key
    octets = models.ManyToManyField(Octet, through='OctetAssignment', blank=True) #not required
    aliases = models.ManyToManyField(Alias, through='AliasAssignment', blank=True) #not required

class OctetAssignment(models.Model):
    octet = models.ForeignKey(Octet) #octet
    group = models.ForeignKey(Group) #group that octet is assigned to

class AliasAssignment(models.Model):
    alias = models.ForeignKey(Alias)
    group = models.ForeignKey(Group)

视图

def index(request):
    if request.method == 'GET':
        groups = Group.objects.all().order_by('name')
        return render_to_response('groups.html', 
                                  { 'groups': groups, }, 
                                  context_instance = RequestContext(request),
                                  )

    elif request.method == "POST":
        g = Group.objects.get(id=request.POST['id'])
        form = GroupEditForm(instance=g)
        return render_to_response('groups.html',
                                 { 'form': form,  },
                                 context_instance = RequestContext(request),
                                 )

def save(request):
    if request.method == "POST":
        form = GroupEditForm(request.POST)
        if form.is_valid():
            form.save()

        return HttpResponseRedirect('/tradedesk/groups/') # Redirect after POST

为了完整起见,这里是我用来渲染表格和编辑页面的表单模板代码。 模板

    <h1>Group Information</h1>

    {% if groups %}
        <table border=1>

        {% for group in groups %}

        <tr>

        <td>{{group.name}}</td>

        <td>{% for octet in group.octets.all %} {{octet}} {% endfor %}</td>

        <td>{% for alias in group.aliases.all %} {{alias}} {% endfor %}</td>

        <td>{{group.analyst}}</td>

        </tr>

        {% endfor %}

        </table>
    <br></br>

    <form method="post" action="/groups/">{% csrf_token %}
    <select name="id" >
        {% for group in groups %}
        <option value="{{group.id}}">{{group.name}}</option>
        {% endfor %}
    </select>
    <input type="submit" value="Edit">

    </form>
    {% endif %}


    {% if form %}
    <form method="post" action="/groups/save/">{% csrf_token %}

        {{form}}
    <br></br>
    <input type="submit" value="Save">
    <form>

    {% endif %}



</div>

1 个回答

1

试着去掉中间的模型 OctetAssignment 和 AliasAssignment。只有在你想给它们添加自定义字段的时候才需要用到它们。否则,Django 会自动创建这些模型,并且在后台默默使用它们。

撰写回答