【发布时间】:2018-07-10 20:10:14
【问题描述】:
我正在尝试按照以下教程使用 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}}" /> </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 %}
我下面的视图是基于教程,但我使用的是我自己的模型:
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)
我的目录结构设置如下,可能是这样的:
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()
在将分页移到那里后添加了我的 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 }}">«</a></li>
{% else %}
<li class="disabled"><span>«</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 }}">»</a></li>
{% else %}
<li class="disabled"><span>»</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>
我期望我的过滤器对每 10 个用户的搜索结果进行分页。我现在得到的是整个用户集。过滤器正常工作,但分页不正常。
【问题讨论】:
-
您的问题有
{% for user in filter.qs %},但您没有在问题的其他任何地方使用filter。 -
这不是在调用我的 filter.py 吗?我在上面插入了 filter.py。我的搜索结果使用 filter.qs 正确地通过我的 for 循环,如果我将其更改为用户,我不会得到任何结果。过滤器应该在 filter.form 上,它显示在模板的顶部。
-
你不能像那样从模板中调用 python 模块。您的视图有一个上下文
{ 'users': users },因此您可以在模板中访问{{ users }}。该视图不会将filter添加到上下文中,因此{{ filter.qs }}不会起作用。 -
好的,我想我明白了。我应该将此添加到我的 def search(request) user_filter = UserFilter(request.GET, queryset=user_list) 然后调用 {'filter': user_filter}
-
看起来差不多,与the django-filter docs 中的示例非常相似。然后,一旦可行并且您想要对结果进行分页,请尝试将分页器更改为使用
user_filter.qs而不是user_list:paginator = Paginator(user_filter.qs, 1)
标签: django django-filter django-pagination