【问题标题】:post_list() missing 1 required positional argument: 'request'post_list() 缺少 1 个必需的位置参数:“请求”
【发布时间】:2021-07-28 18:37:45
【问题描述】:

我有

查看.py

class mainView(View):
    template_name = "search.html"

    def error_page(self,request):
        return render(request, 'error_page.html')

    def getQuery(self,query,):
        posts_list = Galeria.objects.filter(
            Q(nazwa__icontains=query) | Q(opis__icontains=query)
        ).distinct()
        return(posts_list)

    def postPagination(self,paginator,page):
        try:
            posts = paginator.page(page)
        except PageNotAnInteger:
            posts = paginator.page(1)
        except EmptyPage:
            posts = paginator.page(paginator.num_pages)
        return posts

    def post_list(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


urlpatterns = [
              
                  path('searchbar/', mainView.post_list, name="searchbar"),
...
]

为什么我收到错误“post_list() 缺少 1 个必需的位置参数:'request'”? 我尝试了一切,并阅读了此页面上的文档https://docs.djangoproject.com/en/3.2/topics/class-based-views/intro/ 还是什么都没有。

【问题讨论】:

  • 根据您链接的文档,看起来path 的第二个参数应该是as_view() 调用的结果,而不是采用request 参数的实例方法。你觉得mainView.post_list应该怎么做?
  • 我只是尝试将 view.py 中的函数重构为类,效果很好。我在想它可以在课堂上使用,也可以在没有的情况下使用

标签: python django request


【解决方案1】:

您以错误的方式使用基于类的视图。通常你实现getpostput等方法来返回一个HTTP响应,此外你应该使用.as_view()将基于类的视图包装成一个函数:

class mainView(View):
    # …

    #   ↓ use get, not post_list
    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)

urls.py:

urlpatterns = [
    #                          ↓ use .as_view()
    path('searchbar/', mainView.as_view(), name="searchbar"),
    # …
]

话虽如此,看起来您正在实现自己的ListView [Django-doc] 版本,最好从ListView 开始并覆盖.get_queryset(…) 等一些方法来实现您的视图。这也将删除很多样板代码,如分页等。

【讨论】:

  • 好的,我开始按照你说的做,它开始工作了!感谢您的帮助:) 我使用了 ListView 的 TemplateView insteda。
猜你喜欢
  • 1970-01-01
  • 2021-08-12
  • 2018-01-24
  • 2020-05-07
  • 2018-12-12
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-07-12
相关资源
最近更新 更多