Получить параметры URL-адреса в представлениях на основе классов для Django 3.2

#python #django #get

Вопрос:

Я нашел аналогичный вопрос, но он был для Django 1.5, и я не думаю, что он сработал для меня.

 class SearchedPostListView(ListView):
    model = Post
    template_name = 'blog/search.html'  # <app>/<model>_<viewtype>.html
    paginate_by = 2
    context_object_name = 'posts'   

    def get_context_data(self, *args, **kwargs):
        context = super(SearchedPostListView, self).get_context_data(*args, **kwargs)
        query = self.kwargs.get('q')
        context['posts'] = Post.objects.filter(Q(title__icontains=query) | Q(author__username__icontains=query) | Q(content__icontains=query))
        context['categories'] = Categories.objects.all
        return context
 

Это мой код. Я пытаюсь просмотреть все сообщения на своем веб-сайте, и я показываю все сообщения, в названии которых есть запрос.

Итак, если я введу URL localhost:8000/search?q=foo -адрес , он должен показать мне сообщения, содержащие это слово foo в названии.

Но я не могу получить доступ к параметрам GET. Как получить доступ к параметрам GET в Django 3.2?

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

1. То же, что и представление на основе функций, self.request.GET.get("q")

Ответ №1:

Используйте query = self.request.GET.get('q') вместо query = self.kwargs.get('q') этого .

     class SearchedPostListView(ListView):
        model = Post
        template_name = 'blog/search.html'  # /_.html
        paginate_by = 2
        context_object_name = 'posts'   
    
        def get_context_data(self, *args, **kwargs):
            context = super(SearchedPostListView, self).get_context_data(*args, **kwargs)
            query = self.request.GET.get('q')
            context['posts'] = Post.objects.filter(Q(title__icontains=query) | Q(author__username__icontains=query) | Q(content__icontains=query))
            context['categories'] = Categories.objects.all
            return context