如何解决使用来自搜索的有效参数调用我的搜索结果视图
我有一个函数,它提供一个搜索模板,当搜索模板完成并有效时,调用我的搜索结果视图,该视图根据响应中完成的参数生成结果。我的问题是我使用 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})
搜索结果视图很长,但 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')
.
.
.
网址看起来像
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')
...
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。