Django视图内处理ManyToMany表单字段创建保存新模型实例失败如何解决
解决方案
错误原因
Django的多对多字段对应的数据存储在独立的中间关联表中,需要先保存主模型实例(这里是Pollers)获得主键ID后,才能操作中间表完成关联。直接在实例化主模型时给多对多字段赋值是不被允许的,这也是报错提示的核心含义。
代码调整步骤
只需要修改views.py中保存实例的逻辑即可:
- 实例化
Pollers时移除poller_categories的直接赋值 - 主实例保存完成后,调用多对多字段的
set()方法传入选中的分类列表
修改后的views.py代码
def raise_poller(request): # if this is a POST request we need to process the form data if request.method == 'POST': # create a form instance and populate it with data from the request: form = PollersForm(request.POST) # check whether it's valid: if form.is_valid(): # process the data in form.cleaned_data as required poller_nature = form.cleaned_data['poller_nature'] poller_text = form.cleaned_data['poller_text'] poller_choice_one = form.cleaned_data['poller_choice_one'] poller_choice_two = form.cleaned_data['poller_choice_two'] poller_categories = form.cleaned_data['poller_categories'] # Get the user created_by = request.user # 保存Poller主实例,去掉多对多字段的直接赋值 p = Pollers(poller_nature = poller_nature, poller_text = poller_text, poller_choice_one = poller_choice_one, poller_choice_two = poller_choice_two, created_by = created_by) p.save() # 主实例保存成功后,用set方法设置多对多关联 p.poller_categories.set(poller_categories) # redirect to a new URL: return HttpResponseRedirect('/')
补充说明
如果后续需要给多对多字段追加关联对象,也可以用add()方法,比如p.poller_categories.add(category_instance),清空所有关联可以用clear()方法。
内容的提问来源于stack exchange,提问作者JSRB
相关产品推荐
相关产品推荐

