You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.21 18:48:24