微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

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

如何解决使用来自搜索的有效参数调用我的搜索结果视图

我有一个函数,它提供一个搜索模板,当搜索模板完成并有效时,调用我的搜索结果视图,该视图根据响应中完成的参数生成结果。我的问题是我使用 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 举报,一经查实,本站将立刻删除。

相关推荐


Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其他元素将获得点击?
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。)
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbcDriver发生异常。为什么?
这是用Java进行XML解析的最佳库。
Java的PriorityQueue的内置迭代器不会以任何特定顺序遍历数据结构。为什么?
如何在Java中聆听按键时移动图像。
Java“Program to an interface”。这是什么意思?