过滤后的搜索帖子结果中的 Django 分页

标签 django django-pagination

我有一个 View 可以过滤已发布的搜索表单的结果:

def profile_advanced_search(request):
    args = {}
    if request.method == "POST":
        form = AdvancedSearchForm(request.POST)
        qs=[]
        if form.is_valid():
            cd = form.cleaned_data

            s_country=cd['country']
            s_province=cd['province']
            s_city = cd['city']

            if s_country: qs.append(Q(country__icontains = s_country))    
            if s_province: qs.append( Q(province__icontains=s_province))                
            if s_city: qs.append( Q(city__icontains=s_city))



            f = None
            for q in qs:
                if f is None: 
                    f=q 

                else: f &=q
            list = UserProfile.objects.filter(f).order_by('-created_at') 


    else:
        form = AdvancedSearchForm()
        list = UserProfile.objects.all().order_by('-created_at')

    paginator = Paginator(list,10)            
    page= request.GET.get('page')
    try:
        results = paginator.page(page)
    except PageNotAnInteger:
        results = paginator.page(1)  

    except EmptyPage:
            results = paginator.page(paginator.num_pages)        

    args.update(csrf(request))    
    args['form'] = form  
    args['results'] = results
    return render_to_response('userprofile/advanced_search.html', args,
                              context_instance=RequestContext(request))  

urls.py 部分是:
url(r'^search/$', 'userprofile.views.profile_advanced_search'),

第一页的结果很好,但问题是当我转到第二页时,过滤的结果被遗忘了。

我很清楚为什么会发生这种情况:在 View 中过滤仅用于 POST 而分页使用 GET 因此查询集过滤器在第一页之后不适用。

我看了几个建议和snippets对于类似的问题,但没有一个与我的观点足够接近,所以我无法弄清楚如何解决它并感谢您的帮助。

更新:这是相关模板:
<form action="/search/" method="post">{% csrf_token %}

          <ul class="list-unstyled">

            <li><h3>Country</h3></li>
            <li>{{form.country}}</li><br> 
            <h4>Province</h4>
            <li>{{form.province}}</li>
              <h4>City</h4>
            <li>{{form.city}}</li>


          </ul>

<input  type="submit" name="submit"  value="search" />

 </form>
     Search Results:
{% for p in results %}

            <div">
                  <div>
                      <br>
                       <strong><a href="/profile/{{p.username}}" >{{p.username}}</a></strong>
                         {{p.country}} <br>
                         {{p.province}} <br>
                         {{p.city}} <br>

                     </div>
                  </div>
{% endfor %}



<div>
    <div class="pagination">
      {% if results.has_previous %}
          <a href="?page={{ results.previous_page_number }}"> << Prev </a>&nbsp;&nbsp
      {% endif %}

       {% if results.has_next %}
          <a href="?page={{ results.next_page_number }}"> Next >> </a>
      {% endif %}
    </div>
  </div>

</div>

最佳答案

您应该移至 Post/Redirect/Get图案。您需要 2 意见,第一个是形式,第二个是结果。

  • 创建一个 新品 url能够解析所有三个参数加上页面。 /(?P<country>\w+)/(?P<province>\w+)/(?P<site>\w+)/(?P<page>\d+) .将此网址路由到 新 View show_results .此 View 显示 page所有三个参数的结果过滤。
  • 在 View 表单中,收到搜索参数后,编写 url 并重定向到它。 return HttpResponseRedirect(reverse('your.views.show_results', args=(country, province, site, 0, )))

  • 显然,您可以使用 GET 代替命名的 url 参数。键值参数。

    看看谷歌是如何以这种方式工作的:
    https://www.google.es/search?q=post+redirect+get

    关于过滤后的搜索帖子结果中的 Django 分页,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28751000/

    相关文章:

    Python coverage.py exclude_lines

    django - 使用带有分页功能的通用 ListView。 Django

    python - Django 分页与基于函数的 View 中 GET 请求中的其他变量

    python - Django 分页中的 EmptyPage 错误

    python - 在 Django Rest 框架分页中添加新值

    javascript - Jquery使选项卡从另一个页面激活

    mysql - 使用 mysql 的保留关键字作为 django 的字段有什么缺点?

    python - 使用 PIP 安装程序在 MAC OS X LION 10.7.2 上安装 PIL

    Django 聚合 - 零值除法

    Django 分页 "That page contains no results"