使用搜索中的有效参数调用我的搜索结果视图



我有一个函数,它会设置一个搜索模板,当搜索模板完成且有效时,会调用我的搜索结果视图,该视图会根据响应中完成的参数生成结果。我的问题是我使用render来显示搜索结果页面,并且URL没有改变(即URL仍然显示get_search,而不是search_results..(。这意味着分页不起作用,因为它没有正确的URL。

我应该使用什么来将响应传递到搜索结果视图并更改URL。尝试reverse_lazy,但正如我所料,它给了我一个属性错误-">proxy"对象没有属性"get"。

我的功能如下:

def get_search(request):
if request.method == 'POST':
form = SearchForm(request.POST)
request.method = "GET"
request.GET = request.POST
if form.is_valid():
return SearchResultsView.as_view()(request)
else:
form = SearchForm()
if form.is_valid():
return SearchResultsView.as_view()(request)
else:
form = SearchForm(request.GET)
return render(request, 'get_search.html', {'form':form})

searchResults视图相当长,但search_Results视图的开头看起来是这样的:

class SearchResultsView(ListView):
model = Program
template_name = 'search_results.html'
paginate_by = 5
def get_context_data(self, **kwargs):
context = super(SearchResultsView, self).get_context_data(**kwargs)
#
segment_results = None
program_results = None
segment_program_list = None
query = self.request.POST.get('q')
start_date = self.request.POST.get('start_date')
end_date = self.request.POST.get('end_date')
svc_choices = self.request.POST.getlist('service_choices')
.
.
.

URL看起来像

path('get_search/', get_search, name='get_search'),
path('search/', SearchResultsView.as_view(), name='search_results'),

您可以将用户从get_search/重定向到search/,同时将搜索参数设置为查询字符串或GET参数:

from django.shortcuts import redirect
from django.urls import reverse

def get_search(request):
if request.method == 'POST':
form = SearchForm(request.POST)
if form.is_valid():
url = '{}?{}'.format(reverse('search_results'), request.POST.urlencode())
return redirect(url)
else:
form = SearchForm()
# You might want to remove the next 4 lines? they don't appear very logical to me, ideally in the GET method you render the form, in POST you process it.
if form.is_valid():# You check the form validity for both types of requests??
return redirect('search_results')
else:
form = SearchForm(request.GET)
return render(request, 'get_search.html', {'form':form})

接下来,在SearchResultsView中只需使用GET参数:

class SearchResultsView(ListView):
model = Program
template_name = 'search_results.html'
paginate_by = 5
def get_context_data(self, **kwargs):
context = super(SearchResultsView, self).get_context_data(**kwargs)
segment_results = None
program_results = None
segment_program_list = None
query = self.request.GET.get('q')
start_date = self.request.GET.get('start_date')
end_date = self.request.GET.get('end_date')
svc_choices = self.request.GET.getlist('service_choices')
...

最新更新