Django paginator不在下一页提供内容

时间:2017-10-09 15:32:38

标签: django pagination

我使用Django paginator将搜索结果分成几页

from django.core.paginator import Paginator, EmptyPage, PageNotAnInteger

在我看来,我根据表单

的输出执行搜索
@login_required
def payment_range_list(request):
    #import pdb; pdb.set_trace()

    title = 'payment list'
    #import pdb; pdb.set_trace()
    if request.method == "POST":
        form = PaymentRangeForm(request.POST)
        #import pdb; pdb.set_trace()

        if form.is_valid():
            start_date = form.cleaned_data['start_date']
            end_date = form.cleaned_data['end_date']
            building = form.cleaned_data['building']

            payment_list = LeasePaymentFilter(request.GET, queryset=LeasePayment.objects.filter(payment_date__range=[start_date, end_date],lease__unit__building = building ))
            paginator = Paginator(payment_list, 25) # Show 25 contacts per page

            page = request.GET.get('page')
            try:
                payment_page = paginator.page(page)
            except PageNotAnInteger:

                payment_page = paginator.page(1)
            except EmptyPage:

                payment_page = paginator.page(paginator.num_pages)
        else:
            payment_list = None
            payment_page = None
            start_date = None
            end_date = None
            building = None



    else:
        payment_list = None
        payment_page = None
        start_date = None
        end_date = None
        building = None

         #form = PaymentRangeForm()
        form = PaymentRangeForm(initial = {'building': 0 })



    return render(request,'payment/payment_range.html', {'form':form, 'payment': payment_list,'page_payment':payment_page, 'start_date':start_date, 'end_date':end_date, 'building':building })

在页面顶部,我有一个用于搜索的表单,第二部分用于显示结果。

{% extends "rent_base.html" %}

{% load crispy_forms_tags %}
    {% block title %}
    Lease List 
    {% endblock title %}
{% block content %}

<div class="container-fluid">





<div class="row">
    <div class="col-sm-10 col-sm-offset-1 hid">
                  <h4 class="display-4">List > Payments> by Date Range </h4><div style="float:right;"> <a href="{% url 'export_payment_range_csv' start_date=start_date end_date=end_date building=building %}" class="btn btn-info" role="button">CSV for current range payments</a></div>
   </div>               
</div>








<div class="row">
<div  class="col-sm-10 col-sm-offset-1 hid">



  <form method="POST"  class="form" action="" method="get">
                {% csrf_token %}
                {{ form|crispy}} 
                <br>
                <button type="submit" class="btn btn-primary btn-primary">Search</button>
  </form>

          <br>
          <b>Start date:</b> {{ start_date }} <b>End date:</b>{{ end_date }}
          <br>
<table class="table table-striped">




        <tr>

                <th># Payment</th>
                <th>Payment type</th>
                <th>Amount </th>
                <th>Deposit</th>
                <th>Lease</th>
                <th>Unit</th>
                <th>Building</th>
                <th>Term</th>
                <th>Payment date</th>
                <th>Payment method</th>
        </tr>



            {% for payment  in page_payment %}
        <tr>
            <td> <a href="{% url 'lease_payment_details' pk=payment.lease.id %}" class="btn btn-default">  {{ payment.id }}</a></td>
            <td>  {{ payment.get_payment_type_display }}</td>
            <td>  {{ payment.amount }}</td>
            <td>       
                      {% if payment.is_deposit  %}
                                              <span class="glyphicon glyphicon-ok text-success" aria-hidden="true" ></span> 
                                          {% else %}
                                              <span class="glyphicon glyphicon-remove text-warning" aria-hidden="true" ></span> 
                                {% endif %}
            </td>

            <td>  {{ payment.lease }}</td>
            <td>  {{ payment.lease.unit.number }}</td>
            <td>  {{ payment.lease.unit.building.name }}</td>
            <td>  {{ payment.leaseterm }}</td>
            <td>  {{ payment.payment_date }}</td>
            <td>  {{ payment.get_method_display }}</td>
        </tr>
            {% endfor %}
</table>
<div class="pagination">
    <span class="step-links">
        {% if page_payment.has_previous %}
            <a href="?page={{ page_payment.previous_page_number }}">previous</a>
        {% endif %}

        <span class="current">
            Page {{ page_payment.number }} of {{ page_payment.paginator.num_pages }}.
        </span>

        {% if page_payment.has_next %}
            <a href="?page={{ page_payment.next_page_number }}">next</a>
        {% endif %}
    </span>
</div>


    </div>
</div></div>
 {% endblock content %} 

我的问题是,当我的搜索返回超过1页的结果数量时,我点击下一页。接下来的页面总是空的。

我的问题是什么反馈?

1 个答案:

答案 0 :(得分:1)

问题是您的serch表单是POST。因此,当您单击下一个按钮时,您发送GET请求并且if request.method == "POST":部分视图未被触发。 我建议你把serch表格换成GET:

<form method="GET" action="">
    <input type="text"  name="q" placeholder="Search" value="{{ request.GET.q }}">
    <input type="submit" value="Search">
</form>

然后将下一个按钮更改为:

{% if payment.has_next %}
        <a href="?page={{ payment.next_page_number}}{% if request.GET.q %}&q={{ request.GET.q }}{% endif %}">next</a>
{% endif %}

即使您转到下一页,这也会将搜索值保存在地址栏中。