Перенаправление Django после поиска с использованием набора запросов

#python #html #django

#python #HTML #django

Вопрос:

Когда я нажимаю поиск на домашней странице, я хочу, чтобы он принимал этот набор запросов, например ( http://127.0.0.1:8000/?q=car ), а затем использовал тот же URL, но в режиме поиска. Я пробовал поискать, но не смог найти ничего, что работало.

Число просмотров:

 class IndexView(ListView):
    model = Post
    # queryset = Post.objects.filter(live=True)
    template_name = "public/index.html"

    def get_queryset(self):
       queryset = super().get_queryset().filter(live=True)
       query = self.request.GET.get("q")
       if query:
        queryset = queryset.filter(title__icontains=query)
       return redirect(reverse('search-view'), queryset)

    def get_context_data(self, **kwargs):
        context = super(IndexView, self).get_context_data(**kwargs)
        context['queryset'] = self.get_queryset()
        context['category'] = Category.objects.all()
        return context
  

URL-адреса:

 urlpatterns = [
    path('', views.IndexView.as_view(), name="index-view"),

    path('post/create/', views.PostCreateView.as_view(), name="post-create"),
    path('post/<slug>/update/', views.PostUpdateView.as_view(), name="post-update"),
    path('post/<slug>/', views.PostDetailView.as_view(), name="post-detail"),

    path('category/', views.CategoryView.as_view(), name="category"),
    path('category/<int:pk>/', views.CategoryDetailView.as_view(), name="category-detail"),

    path('search/', views.SearchListView.as_view(), name="search-view")
]
  

Я пытался сделать это с помощью перенаправления и обратного хода, но это вообще не работает, на самом деле это выдает мне ошибку за использование slice в forloop, который использует queryset. 'slice' object has no attribute 'lower'

У меня есть 2 шаблона / представления. Когда я нажимаю поиск на домашней странице, я хочу, чтобы он переходил к представлению поиска, а затем запускал поисковый запрос там.

Спасибо.

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

1. » Я пытался сделать это с помощью перенаправления и обратного хода, но это вообще не работает. » Можете ли вы указать, что не работает?

2. @Johan Ах да, извините, это моя вина. Итак, когда я загружаю IndexView, он выдает мне ошибку об использовании slice. Теперь я использую slice в forloop в шаблоне IndexView.

3. Не беспокойтесь. Я считаю, что вам нужно использовать именованный параметр в redirect функции, в основном, как redirect(reverse('search-view'), queryset=queryset) , а затем обработать аргумент в SearchListView

4. Или, возможно redirect(reverse('search-view'), args=(queryset))

5. Я добавил queryset=queryset, но не уверен, как обрабатывать аргумент в SearchListView, извините, я довольно новичок в Django.

Ответ №1:

Я думаю, вы немного путаете логику в отношении того, где выполнять фактический запрос. Вы не должны выполнять фактический поиск по запросу в IndexView , который предназначен для SearchListView .

Исходя из информации, которая доступна прямо сейчас (без SearchListView ), я бы сказал, что вы могли бы сделать перенаправление и передать параметр в URL запроса и позволить представлению в SearchListView решить, что делать с информацией:

 def get_queryset(self):
    queryset = super().get_queryset().filter(live=True)
    query = self.request.GET.get("q")
    if query:
        # Fetch the url for the search-view
        base_url = reverse('search-view')
        # Make the search query url encoded
        query_string =  urlencode({'q': query})
        # Tie it together with the url
        url = '{}?{}'.format(base_url, query_string)
        # Fire away
        return redirect(url)
    return redirect(reverse('search-view'), queryset)
  

Источник:
Некоторый код взят из окончательного руководства по перенаправлениям Django Дэниела Хеппера

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

1. Я получаю ошибку атрибута: у объекта ‘HttpResponseRedirect’ нет атрибута ‘filter’