Django:如何将购物车组件Queryset关联到新创建的UserTemplate?
解决Django多对多关联时传入标题而非实例导致的错误
问题原因
你遇到的错误是因为component.template.add(template_title)中传入的是字符串类型的模板标题,而Django的多对多字段add()方法仅接受模型实例或主键ID数值,无法直接识别字符串标题,因此抛出了"Field 'id' expected a number but got 'test template'"的异常。
解决方案
你需要先创建/保存UserTemplate实例,再将购物车中的组件关联到这个实例上,调整代码逻辑和顺序如下:
修改后的post方法代码
def post(self, *args, **kwargs): ce_template_form = SaveAsTemplateForm(data=self.request.POST) if ce_template_form.is_valid(): # 先保存表单,获取UserTemplate实例 user_template = ce_template_form.save() user = self.request.user get_components = user.cart_component.all() # 遍历购物车组件,将每个组件与新模板实例关联 for component in get_components: component.template.add(user_template) return redirect('cart')
可选优化:避免重复创建相同标题的模板
如果需要防止用户创建重复标题的模板,可以先查询数据库中是否存在对应标题的UserTemplate,不存在再创建:
def post(self, *args, **kwargs): ce_template_form = SaveAsTemplateForm(data=self.request.POST) if ce_template_form.is_valid(): template_title = ce_template_form.cleaned_data.get('title') user = self.request.user # 查询或创建对应标题的模板实例 user_template, created = UserTemplate.objects.get_or_create(title=template_title) get_components = user.cart_component.all() for component in get_components: component.template.add(user_template) return redirect('cart')
内容的提问来源于stack exchange,提问作者Adrian
相关产品推荐
相关产品推荐

