post_list() отсутствует 1 необходимый позиционный аргумент: «запрос»

#python #django #request

Вопрос:

у меня есть

View.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 необходимый позиционный аргумент: «запрос»»?
Я все перепробовал и прочитал документацию на этой странице https://docs.djangoproject.com/en/3.2/topics/class-based-views/intro/
и все равно ничего.

Комментарии:

1. Согласно документу, который вы связали, похоже, что второй аргумент должен path быть результатом as_view() вызова, а не методом экземпляра, который принимает request параметр. Как вы думаете mainView.post_list , что следует делать?

2. Я просто пытаюсь реорганизовать свои функции в view.py в класс, и это была очень хорошая работа. Я думал, что это будут работы как в классе, так и без

Ответ №1:

Вы неправильно используете представления на основе классов. Как правило, вы реализуете методы get , post put , и т.д. Для возврата 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], возможно, было бы лучше начать с a ListView и переопределить некоторые методы, например .get_queryset(…) , для реализации вашего представления. Это также приведет к удалению большого количества шаблонного кода, такого как разбиение на страницы и т. Д.

Комментарии:

1. Хорошо, я начинаю делать то, что ты сказал, и это начинало работать! Спасибо за помощь 🙂 Я использовал TemplateView вместо ListView.