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
相关产品推荐
相关产品推荐

