【问题标题】:django pagination not working with django filterdjango 分页不适用于 django 过滤器
【发布时间】:2019-02-21 10:20:51
【问题描述】:

我有一个ListView 页面,它与分页配合得很好。我还在该页面中添加了 Django 过滤器进行过滤。问题是分页运行良好,但使用 Django 过滤器它停止工作。当页面加载时paginate_by 不工作。单击分页时,下一页不起作用。

我做错了什么?

views.py

class JobsListView(ListView, FilterView):
# model = JobPost
queryset = JobPost.objects.all()
template_name = 'jobpost_list.html'
paginate_by = 3
# page_kwargs = 'page'
filterset_class = JobPostFilter

def get_queryset(self, *args, **kwargs):
    if self.kwargs:
        return JobPost.objects.filter(position=self.kwargs['position']).order_by('-created_at')
    else:
        query = JobPost.objects.all().order_by('-created_at')
        return query

def get_context_data(self, **kwargs):
    context = super().get_context_data(**kwargs)
    context['todays'] = date.today()
    context['filter'] = JobPostFilter(self.request.GET,  queryset=self.get_queryset())
    return context

模板

{% extends 'base.html' %}
{% load bootstrap4 %}
{% load fontawesome %}
{% block content %}
  {% if messages %}
<div class="alert alert-success alert-dismissible fade show">
{% for m in messages %}
<li{% if message.tags %} class="{{ message.tags }}"{% endif %}>{{ m }}</li>
     <button type="button" class="close" data-dismiss="alert" aria- 
label="Close">
<span aria-hidden="true">&times;</span>
</button>
{% endfor %}
</div>
 {% endif %}
<div class="col-12">
    <h1 class="text-center">Vacancies</h1>
</div>
<div class="row">
<div class="col-4">
 <form method="get">

     {% bootstrap_form filter.form %}
     {% buttons %}
 <button class="btn btn-primary" type="submit">Search {% fontawesome_icon 
 'search' %}</button>
     {% endbuttons %}
  </form>

</div>

<div class="col-8">

  {% for job in filter.qs %}
  <div class="joblists">
  <h3><a href='{% url "jobpost_detail" job.slug %}'>{{ job.position }} </a> <a 
  href="{% url 'jobpost_update_form' job.slug %}">{% fontawesome_icon 'edit' %}  
  </a></h3>
  <p>{{ job.description|safe|truncatewords:30 }}</p>
  {% if job.location != '' %}
   <p>{% fontawesome_icon 'location-arrow' %} <strong>{{ job.location }} 
   </strong> 
   </p>
   {% endif %}
 <p>{{ job.job_type }}</p>
  {% if job.deadline != NULL and job.deadline > todays %}
    <p>{% fontawesome_icon 'calendar' %} {{ job.deadline|timeuntil }} <small>to 
  deadline</small></p>
  {% endif %}
  {% if job.deadline > todays %}
  <p>{% fontawesome_icon 'check-circle' color='green' %} Open</p>
  {% elif job.deadline < todays %}
  <p>{% fontawesome_icon 'times-circle' color='red' %} Closed</p>
  {% endif %}
 </div>
 {% endfor %}

</div>

<div class="pagination">

{% if is_paginated %}
 <hr>
  <nav aria-label="Page navigation example">
 <ul class="pagination justify-content-center pagination-sm">
    {% if page_obj.has_previous %}
      {% if not search %}
      <li class="page-item">
          <a class="page-link" href="{% url 'jobpost_list' %}?page={{ 
          page_obj.previous_page_number }}" tabindex="-1">Previous</a>
      </li>
      {% else %}
        <li class="page-item">
          <a class="page-link" href="{% url 'jobpost_list' %}?{{search}}&page= 
     {{ page_obj.previous_page_number }}" tabindex="-1">Previous</a>
      </li>
      {% endif %}
    {% else %}
    <li class="page-item disabled">
        <a class="page-link" href="#" tabindex="-1">Previous</a>
    </li>
    {% endif %}
    {% for object in page_obj.paginator.page_range %}
        <li class="page-item"><a class="page-link" href="{% url 'jobpost_list' 
     %}?page={{ forloop.counter }}">{{ forloop.counter }}</a></li>
    {% endfor %}
    {% if page_obj.has_next %}
      {% if not search %}
      <li class="page-item">
          <a class="page-link" href="{% url 'jobpost_list' %}?page={{ 
         page_obj.next_page_number }}">Next</a>
      </li>
      {% else %}
        <li class="page-item">
          <a class="page-link" href="{% url 'jobpost_list' %}?{{search}}&page=      
    {{ page_obj.next_page_number }}">Next</a>
      </li>
      {% endif %}
    {% else %}
    <li class="page-item disabled">
        <a class="page-link" href="#">Next</a>
    </li>
    {% endif %}
  </ul>
  </nav>
 {% endif %}


</div>
 {% endblock %}

【问题讨论】:

    标签: python django django-models django-templates django-views


    【解决方案1】:

    {% for job in filter.qs %} 中,如果您将filter.qs 替换为“object_list”,则分页和过滤将起作用。但是当页面最初加载时,在 url 中没有设置任何过滤器参数时,这不会有任何记录。

    我试图弄清楚可以做什么。正在搜索中......

    【讨论】:

    • 我通过将 filter.qs 更改为 object_list 解决了这个问题,因为我使用的是 FIlterview 并摆脱了 def get_queryset
    • 我尝试了上面提到的方法,但是当没有进行过滤时,我没有得到初始结果。这对你有用吗?
    • 是的。在你的views.py中添加这个Strict = False
    • 具体在哪里?我把它放在我的FilterView 中,但没有用。
    • 来自github.com/carltongibson/django-filter/issues/930 立即解决的方法是在您的过滤器集上设置 strict = False。这会导致实际无效的过滤器参数将导致部分过滤而不是显示空结果,但它现在应该是可行的。 (当然更好的是覆盖视图获取逻辑......)我们将考虑并改进对未绑定案例的处理。
    猜你喜欢
    • 2018-05-11
    • 1970-01-01
    • 2019-08-17
    • 2015-07-24
    • 2018-02-10
    • 2019-08-14
    • 2018-07-10
    • 1970-01-01
    • 2019-09-29
    相关资源
    最近更新 更多