#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’