Django类视图调用post_list方法报缺失request参数如何解决
报错原因
你使用了Django类视图的自定义实例方法作为路由入口,但没有遵循Django类视图的调用规范:
post_list是mainView类的实例方法,第一个参数self代表类的实例,必须实例化类之后调用才会自动传入self- 你直接在urls.py中引用
mainView.post_list时,Django不会自动创建类实例,会把传入的request参数当成self参数,自然就缺少了方法定义中第二个必填的request参数,触发报错。
解决方案
推荐使用标准类视图调度规则修改,仅需要两处调整:
- 修改
View.py中自定义方法的名称,将post_list改为get(适配GET请求的调度规则,原有逻辑无需改动):
# 仅修改方法名,内部代码保持不变 def get(self,request, category_slug=None, **kwargs): posts_list = Galeria.objects.all() query = request.GET.get('q') if query: posts_list = self.getQuery(query) ile = posts_list.count paginator = Paginator(posts_list, 10) # 10 posts per page page = request.GET.get('page') posts = self.postPagination(paginator, page) category = None categories = Category.objects.all() if category_slug: category = get_object_or_404(Category, slug=category_slug) categories_ile = Galeria.objects.values('category__name').annotate(count=Count('category__name')) context = { 'posts': posts, 'ile': ile, 'categories': categories, 'category': category, 'categories_ile': categories_ile} return render(request, "search.html", context)
- 修改
url.py中的路由配置,使用类视图的标准调用方式as_view():
urlpatterns = [ # 无分类参数的搜索路由 path('searchbar/', mainView.as_view(), name="searchbar"), # 可选:带分类slug参数的路由 path('searchbar/<slug:category_slug>/', mainView.as_view(), name="searchbar_with_category"), ... ]
如果你不需要使用类视图的其他特性,也可以直接把post_list方法移出mainView类,改为独立的函数视图,去掉self参数后,原有路由配置不需要改动即可正常运行。
内容的提问来源于stack exchange,提问作者Dejv94
相关产品推荐
相关产品推荐

