Django ModelForm 保存 ManyToManyField 问题
我刚开始学习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 会自动创建这些模型,并且在后台默默使用它们。