Django视图配置Filter报错:name 'request' 未定义
解决Django类视图中
NameError: name 'request' is not defined的问题 嘿,这个问题我之前写Django类视图的时候也踩过坑,很容易搞混类视图和函数视图里请求对象的调用方式!
错误原因
在Django的类视图中,request并不是直接可用的全局变量。你在get_context_data方法里直接写request.user,Python会找不到这个变量,自然就抛出NameError了。而在函数视图(比如你写的index函数)里,request是作为参数传入的,所以可以直接用,但类视图的请求对象是绑定在视图实例上的,需要通过self.request来访问。
解决方法
只需要把代码里的request.user替换成self.request.user就行——类视图的实例已经通过LoginRequiredMixin和Django基础视图类封装了请求对象,通过self就能拿到它。
修改后的完整代码如下:
from django.shortcuts import render from django.http import HttpResponse from django.views.generic import TemplateView,ListView,DetailView from django.contrib.auth.mixins import LoginRequiredMixin from .models import Post # Create your views here. def index(request): return HttpResponse("Hello, world.") class HomePageView(LoginRequiredMixin,ListView): model = Post template_name = 'home.html' context_object_name = 'deeppost' def get_context_data(self, **kwargs): # Call the base implementation first to get a context context = super().get_context_data(**kwargs) # Add in a QuerySet of all the books # 这里把request.user改成self.request.user context['deeppost'] = Post.objects.filter(author=self.request.user) return context
额外小提示
其实你还可以简化这段逻辑:因为已经指定了model = Post,ListView默认会把查询集放到context_object_name对应的变量里,你可以直接重写get_queryset方法来过滤数据,这样代码更符合类视图的规范:
class HomePageView(LoginRequiredMixin,ListView): model = Post template_name = 'home.html' context_object_name = 'deeppost' def get_queryset(self): # 直接返回过滤后的查询集,ListView会自动把它放到context里 return Post.objects.filter(author=self.request.user)
这种方式比重写get_context_data更简洁,也更贴合Django类视图的设计思路哦!
内容的提问来源于stack exchange,提问作者Deep Jhavar
相关产品推荐
相关产品推荐

