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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.27 04:12:18