带分页的 Django 过滤器

use*_*034 6 django django-filter django-pagination

我正在尝试按照以下教程使用 django 过滤器进行分页,但该教程似乎缺少某些内容,而且我无法使用基于函数的视图方法显示分页。

https://simpleisbetterthancomplex.com/tutorial/2016/08/03/how-to-paginate-with-django.html

My updated users_list.html is the following:

   {% extends 'base.html' %}

{% load widget_tweaks %}

{% block content %}
  <form method="get">
    <div class="well">
      <h4 style="margin-top: 0">Filter</h4>
      <div class="row">
        <div class="form-group col-sm-4 col-md-4">
          <label/> 3-4 User ID
          {% render_field filter.form.employeentname class="form-control" %}
        </div>
        <div class="form-group col-sm-4 col-md-4">
          <label/> First Name
          {% render_field filter.form.employeefirstname class="form-control" %}
        </div>
        <div class="form-group col-sm-4 col-md-4">
          <label/> Last Name
          {% render_field filter.form.employeelastname class="form-control" %}
        </div>

        <div class="form-group col-sm-4 col-md-4">
          <label/> Status
          {% render_field filter.form.statusid class="form-control" %}
        </div>

        <div class="form-group col-sm-4 col-md-4">
          <label/> Title
          {% render_field filter.form.positiondesc class="form-control" %}
        </div>
      </div>
      <button type="submit" class="btn btn-primary">
        <span class="glyphicon glyphicon-search"></span> Search
      </button>
    </div>
  </form>
  <form action = "{% url 'results' %}" form method = "POST">
        {% csrf_token %}
  <table class="table table-bordered">
    {{ form.as_table }}
    <thead>
      <tr>
        <th>3-4</th>
        <th>First name</th>
        <th>Last name</th>
        <th>Title</th>
        <th>Status</th>
        <th></th>

      </tr>
    </thead>
    <tbody>
      {% for user in filter.qs %}
        <tr>
          <td>{{ user.employeentname }}</td>
          <td>{{ user.employeefirstname }}</td>
          <td>{{ user.employeelastname }}</td>
          <td>{{ user.positiondesc }}</td>
          <td>{{ user.statusid }}</td>
          <td><input type="checkbox" name="usercheck" value = "{{user.employeentname}}" />&nbsp;</td>

        </tr>
      {% empty %}
        <tr>
          <td colspan="5">No data</td>
        </tr>
      {% endfor %}
    </tbody>
  </table>



          <button class="btn btn-primary" type="submit">Select User</button>
        </form>
{% endblock %}
Run Code Online (Sandbox Code Playgroud)

我下面的观点基于教程,但我使用的是我自己的模型:

def user_list(request):
    user_list = Employee.objects.all()
    user_filter = UserFilter(request.GET, queryset=user_list)
    user_list = user_filter.qs
    page = request.GET.get('page', 1)



    paginator = Paginator(user_list.qs, 10)
    try:
        users = paginator.page(page)
    except PageNotAnInteger:
        users = paginator.page(1)
    except EmptyPage:
        users = paginator.page(paginator.num_pages)


    args = {'filter':user_filter, 'users':users}


    return render(request, 'user_list.html', args)
Run Code Online (Sandbox Code Playgroud)

我的目录结构设置如下,也许是这样的:

在此处输入图片说明

from django import forms
from .models import Employee

import django_filters


class UserFilter(django_filters.FilterSet):


    class Meta:
        model = Employee
        fields =  ['employeentname', 'employeefirstname', 'employeelastname', 'statusid', 'positiondesc']





    def __init__(self, *args, **kwargs):
        super(UserFilter, self).__init__(*args, **kwargs)
        # at sturtup user doen't push Submit button, and QueryDict (in data) is empty
        if self.data == {}:
            self.queryset = self.queryset.none()
Run Code Online (Sandbox Code Playgroud)

在那里移动分页后添加了我的 base.html:

{% load static %}<!DOCTYPE html>
<html lang="en">
  <head>
    <meta charset="utf-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1">
    <link href="{% static 'css/bootstrap.min.css' %}" rel="stylesheet">
    <!--[if lt IE 9]>
      <script src="https://oss.maxcdn.com/html5shiv/3.7.3/html5shiv.min.js"></script>
      <script src="https://oss.maxcdn.com/respond/1.4.2/respond.min.js"></script>
    <![endif]-->
    <style type="text/css">
      .page-header {
        margin-top: 0;
      }
    </style>
  </head>
  <body>
    {% include 'includes/header.html' %}
    <div class="container">
      {% block content %}
      {% if users.has_other_pages %}
        <ul class="pagination">
         {% if users.has_previous %}
           <li><a href="?page={{ users.previous_page_number }}">&laquo;</a></li>
         {% else %}
          <li class="disabled"><span>&laquo;</span></li>
       {% endif %}
         {% for i in users.paginator.page_range %}
           {% if users.number == i %}
             <li class="active"><span>{{ i }} <span class="sr-only">(current)
          </span></span></li>
           {% else %}
             <li><a href="?page={{ i }}">{{ i }}</a></li>
           {% endif %}
         {% endfor %}
         {% if users.has_next %}
           <li><a href="?page={{ users.next_page_number }}">&raquo;</a></li>
         {% else %}
           <li class="disabled"><span>&raquo;</span></li>
         {% endif %}
       </ul>
         {% endif %}
      {% endblock %}
    </div>
    <script src="{% static 'js/jquery-3.1.1.min.js' %}"></script>
    <script src="{% static 'js/bootstrap.min.js' %}"></script>





    {% block javascript %}

    {% endblock %}
  </body>
</html>
Run Code Online (Sandbox Code Playgroud)

我期望我的过滤器为每 10 个用户对搜索结果进行分页。我现在得到的是整个用户集。过滤器工作正常,但不是分页。

Jas*_*ich 9

你可以这样分页:

注意:user_filter.qs 有过滤结果,user_filter.queryset 有未过滤结果

视图.py

      def search(request):
         user_list = Employee.objects.all()
         user_filter = UserFilter(request.GET, queryset=user_list)
         user_list = user_filter.qs
         
         paginator = Paginator(user_list, 10)
         page = request.GET.get('page', 1)
         try:
            users = paginator.page(page)
         except PageNotAnInteger:
            users = paginator.page(1)
         except EmptyPage:
            users = paginator.page(paginator.num_pages)
         args = {'paginator': paginator,'filter':user_filter, 
           'users':users,}
         return render(request, 'search/user_list.html', args)
Run Code Online (Sandbox Code Playgroud)

然后在模板中:

   {% for user in users %}
     <tr>
      <td>{{ user.employeeusername }}</td>
      <td>{{ user.employeefirstname }}</td>
      <td>{{ user.employeelastname }}</td>
      <td>{{ user.statusid }}</td>
      <td><input type="checkbox" name="usercheck" />&nbsp;</td>

    </tr>
  {% empty %}
    <tr>
      <td colspan="5">No data</td>
    </tr>
  {% endfor %}
</tbody>
Run Code Online (Sandbox Code Playgroud)
 {% if users.has_other_pages %}
   <ul class="pagination">
    {% if users.has_previous %}
      <li><a href="?page={{ users.previous_page_number }}">&laquo;</a></li>
    {% else %}
     <li class="disabled"><span>&laquo;</span></li>
  {% endif %}
    {% for i in users.paginator.page_range %}
      {% if users.number == i %}
        <li class="active"><span>{{ i }} <span class="sr-only">(current)
     </span></span></li>
      {% else %}
        <li><a href="?page={{ i }}">{{ i }}</a></li>
      {% endif %}
    {% endfor %}
    {% if users.has_next %}
      <li><a href="?page={{ users.next_page_number }}">&raquo;</a></li>
    {% else %}
      <li class="disabled"><span>&raquo;</span></li>
    {% endif %}
  </ul>
{% endif %}
Run Code Online (Sandbox Code Playgroud)