django ModelForm使用ManyToManyField保存问题

时间:2010-12-09 21:50:11

标签: python django django-views

我是Django的新手,需要一些关于我得到的视图错误的帮助。

如果请求方法是GET,我编写了一个显示“Groups”数据表的视图,或者如果请求方法是POST,则显示一个表单来编辑特定的“Group”(要编辑的项目与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 个答案:

答案 0 :(得分:1)

尝试删除中间模型OctetAssignment和AliasAssignment。只有在要向其添加自定义字段时才应使用它们。否则Django会自己创建它们并透明地使用它们。