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

Django使用CreateView创建Comprobante时触发KeyError错误

解决Django CreateView创建Comprobante时的KeyError: 'comprobante'问题

问题原因

报错的核心根源在视图的success_message配置:

success_message = "%(comprobante)s fue creado exitosamente"

Django的SuccessMessageMixin渲染成功消息时,会从上下文变量中查找comprobante这个键,但CreateView默认将新建对象以object为键存入上下文,而非comprobante,因此找不到对应变量抛出KeyError。

另外模板中直接使用comprobante.id进行判断,但CreateView默认上下文里不存在comprobante变量,这也是潜在问题(当前报错来自POST请求后的成功消息渲染)。

解决方法

方法1:修改success_message使用默认变量名

直接将%(comprobante)s替换为%(object)s,CreateView会自动把新建实例传入object变量:

class ComprobanteCreate(SuccessMessageMixin, CreateView):
    model = Comprobante
    fields = '__all__'
    success_url = reverse_lazy('caja_chica:comprobante_list')
    # 使用object变量对应新建的Comprobante实例
    success_message = "%(object)s fue creado exitosamente"

由于Comprobante模型的__str__方法返回numero字段,消息会显示该实例的编号,符合需求。

方法2:自定义上下文变量名(如需保留comprobante关键字)

重写get_success_message方法,手动将新建实例以comprobante为键传入消息上下文:

class ComprobanteCreate(SuccessMessageMixin, CreateView):
    model = Comprobante
    fields = '__all__'
    success_url = reverse_lazy('caja_chica:comprobante_list')
    success_message = "%(comprobante)s fue creado exitosamente"

    def get_success_message(self, cleaned_data):
        # 将新建实例赋值给comprobante键,供消息模板使用
        return self.success_message % dict(cleaned_data, comprobante=self.object)

模板问题修正

为让模板中comprobante.id的判断正常工作,可在视图中重写get_context_data,将实例传入comprobante上下文:

def get_context_data(self, **kwargs):
    context = super().get_context_data(**kwargs)
    # 创建页面时object为None,编辑页面时为实例
    context['comprobante'] = self.object
    return context

内容的提问来源于stack exchange,提问作者Emilio

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.30 07:42:43