Django使用forms.py添加ManyToManyFields触发直接赋值报错如何解决
问题解决方法
错误原因
多对多(ManyToMany)字段本质是维护两张表的关联关系,不支持直接用=赋值单个对象,且使用form.save(commit=False)时,Post实例还未写入数据库,没有主键ID,无法建立多对多关联,所以触发报错。
修正后的视图代码
把你原来触发报错的循环逻辑替换为如下代码即可:
def adminNewPostView(request): form = forms.PostForm() if request.method == 'POST': # 原有其他逻辑保持不变 tags = request.POST.getlist('tagName') form = forms.PostForm(request.POST, request.FILES) if form.is_valid(): post = form.save(commit=False) post.author = request.user post.category = cat if subcat: post.sub_categories = subcat if subfil: post.filter_option = subfil # 先保存Post实例到数据库,生成主键ID,才能建立多对多关联 post.save() add_tags = models.Tags.objects.filter(tag__in=tags) # 直接用set方法批量设置关联标签,无需循环赋值 post.tag.set(add_tags) # 可选:如果需要支持自动创建用户提交的不存在的标签,可以替换上面两句为: # for tag_name in tags: # tag_obj, created = models.Tags.objects.get_or_create(tag=tag_name) # post.tag.add(tag_obj) return HttpResponseRedirect(reverse('blog_app:index'))
相关方法说明
set()方法:接收标签对象的可迭代对象(比如查询集、列表),直接覆盖设置当前Post的所有关联标签,会清空之前已有的关联后添加新的,适合本次提交的标签就是全部关联标签的场景add()方法:在现有关联的基础上追加新的标签,不会清空原有关联
内容的提问来源于stack exchange,提问作者Nahidujjaman Hridoy
相关产品推荐
相关产品推荐

