Django使用django-taggit时表单提交标签无法存入数据库问题求助
你遇到的标签无法保存的问题主要来自两个可能的原因,按优先级排查即可解决:
1. 检查基础配置
首先确认你的Django项目settings.py的INSTALLED_APPS列表中已经添加了taggit,这是taggit库正常工作的前提:
INSTALLED_APPS = [ # 其他原有应用 'taggit', ]
2. 修复表单配置(核心问题)
你当前在QuestionForm中单独定义了tags = TagField(),但没有将这个字段和模型的tags关联,也没有在保存时手动处理提交的标签数据。save_m2m()只会自动处理Meta.fields中声明的模型原生多对多字段,额外自定义的字段不会被自动保存。
最简解决方案(推荐)
直接删掉自定义的tags = TagField(),把tags加入到Meta.fields中即可,TaggableManager会自动适配表单字段,不需要额外定义:
修改你的forms.py为以下内容:
from django.forms import ModelForm from .models import Question class QuestionForm(ModelForm): class Meta: model = Question fields = ('name', 'title', 'body', 'tags')
修改完之后,你现有的视图代码不需要做任何改动,save_m2m()会自动保存用户提交的标签内容。
如果你需要自定义TagField的属性
如果要保留你现在自定义tags字段的写法(比如要修改提示文字、校验规则等),就需要在视图中手动处理标签的保存,修改你的视图代码如下:
def question_form(request): new_question = None if request.method == 'POST': question_form = QuestionForm(data=request.POST) if question_form.is_valid(): new_question = question_form.save(commit=False) new_question.slug = slugify(new_question.title, allow_unicode=True) # 加allow_unicode=True支持中文slug new_question.save() # 手动保存标签 new_question.tags.add(*question_form.cleaned_data['tags']) else: question_form = QuestionForm() return render(request, 'questions/que/form.html', {'question_form':question_form, 'new_question':new_question})
额外注意
如果你使用的是Django默认的slugify方法,需要传入allow_unicode=True参数才能支持中文slug,和你模型中SlugField的allow_unicode=True配置对应,避免中文标题生成slug失败的问题。
内容的提问来源于stack exchange,提问作者Yasaman Shokri
相关产品推荐
相关产品推荐

