Django报错NameError: name 'request' is not defined 问题求助
解决Django中
NameError: name 'request' is not defined的问题 嘿,我来帮你搞定这个报错!你碰到的这个错误原因很明确——在类视图的form_valid方法里直接用了request变量,但它在当前方法的作用域里根本没被定义。
先看看你原来的代码:
class ShiftCreateView(CreateView): fields = ('name', 'timein', 'timeout', 'desc') model = models.Shift def form_valid(self, form): self.object = form.save(commit=False) self.object.timein = request.POST.get("timein", "") self.object.timeout = request.POST.get("timeout", "") self.object.save() return super(ModelFormMixin, self).form_valid(form)
问题分析
在Django的基于类的视图(CBV)中,请求对象是作为类实例的属性存在的,也就是self.request,而不是全局的request变量。你直接写request.POST,Python找不到这个变量,自然就抛出NameError了。另外还有个小细节:你调用super()的时候用了ModelFormMixin,这不是最佳实践,应该用当前视图类的名字,或者直接用super()(Python3+支持)。
修正后的代码
class ShiftCreateView(CreateView): fields = ('name', 'timein', 'timeout', 'desc') model = models.Shift def form_valid(self, form): self.object = form.save(commit=False) # 改用self.request来访问请求对象 self.object.timein = self.request.POST.get("timein", "") self.object.timeout = self.request.POST.get("timeout", "") self.object.save() # 用当前类调用super,确保继承链正确 return super(ShiftCreateView, self).form_valid(form) # Python3+可以简化成:return super().form_valid(form)
额外优化建议
其实你完全不用手动从POST里取数据,因为表单验证后已经有了干净的cleaned_data字典,用它更安全,还能自动处理类型转换:
self.object.timein = form.cleaned_data.get("timein", "") self.object.timeout = form.cleaned_data.get("timeout", "")
这样既避免了直接操作原始POST数据的风险,代码也更符合Django的表单处理规范。
内容的提问来源于stack exchange,提问作者Dicky Raambo
相关产品推荐
相关产品推荐

