Django使用taggit时非Staff用户标签无法存入数据库问题排查
Django-taggit 标签无法通过视图存入数据库的问题分析
已在Django项目中安装taggit并将其添加至settings.py的INSTALLED_APPS中,手动通过管理员面板可成功向数据库插入标签数据,但非Staff用户通过以下视图提交数据时,虽能获取到标签字段的值,却无法将其存入数据库。相关视图代码如下:
def addque(request): if request.method == "POST": user = request.user if user.is_anonymous: return redirect('addquery') if user.is_active: question = request.POST['question'] body = request.POST['body'] tags = request.POST['tags'] aquuid = request.user.aquuid addquery = Question(question=question, user_id=aquuid, que_body=body, tags=tags) addquery.save() return redirect('addquery') else: return render(request, 'question/ask.html')
问题原因及解决方法
- 直接赋值
taggit字段无效:Django-taggit提供的TaggableManager不是普通数据库字段,无法像CharField那样在实例化模型时直接赋值。管理员面板能正常工作是因为后台自动处理了标签字段的表单解析逻辑,自定义视图则需要手动实现这一步。 - 正确的标签添加步骤:
- 先创建并保存Question实例(不要在实例化时传入tags参数):
addquery = Question(question=question, user_id=aquuid, que_body=body) addquery.save() - 将前端传来的标签字符串分割为标签列表(通常按逗号分割,同时去除空白字符),再调用
add()方法添加:# 处理前端传来的标签字符串,比如"python,django, web"会被处理为["python", "django", "web"] tag_list = [tag.strip() for tag in tags.split(',') if tag.strip()] addquery.tags.add(*tag_list)
- 先创建并保存Question实例(不要在实例化时传入tags参数):
内容的提问来源于stack exchange,提问作者Aditya Thute
相关产品推荐
相关产品推荐

