首页 > 解决方案 > django 分页不适用于 django 过滤器

问题描述

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

我究竟做错了什么?

视图.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 %}

标签: pythondjangodjango-modelsdjango-templatesdjango-views

解决方案


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

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


推荐阅读