django - Django分页page_obj.number没有改变
问题描述
我有以下视图并且内容正确呈现。分页也是正确的。唯一的问题是模板中的 page_obj.number 始终为 1。即使单击第 3 页,也会显示第 3 页的内容,但 page_obj.number 仍然为 1。也许我在我看来做错了什么。这里的观点:
class SpecificationListView(AjaxRequiredMixin, ListView):
model = Category
context_object_name = 'categories'
template_name = 'catalog/specification/listSpecificationFiltered.html'
paginate_by = 2
def get_queryset(self):
search_value = self.request.POST.get('searchValue', None)
sel_category = self.request.POST.get('selCategory', 'ALL')
chk_active = self.request.POST.get('chkActive', 0)
category_filters = Q()
if sel_category != 'ALL':
category_filters = category_filters & Q(pk=sel_category)
specification_filters = Q()
search_value = None if (search_value == '' or len(search_value) < 3) else search_value
if search_value is not None:
specification_filters = specification_filters & Q(name__icontains=search_value)
if chk_active == '1':
specification_filters = specification_filters & Q(is_active=True)
# categories are retrieved to build the tree in template
categories_list = Category.objects.distinct().filter(category_filters)
category_ids = categories_list.values_list('id', flat=True) # category ids on page
specification_filters = specification_filters & Q(category_id__in=category_ids)
categories_list = categories_list.prefetch_related(
Prefetch(
'specifications',
queryset=Specification.objects.filter(specification_filters)
)
)
return categories_list
def post(self, request, *args, **kwargs):
return self.get(request, *args, **kwargs)
def get_context_data(self, **kwargs):
context = super(SpecificationListView, self).get_context_data(**kwargs)
page = self.request.POST.get('page')
paginator = Paginator(self.object_list, self.paginate_by)
categories = paginator.get_page(int(page))
context.update({
'categories': categories,
'page_title': _('Manage Specifications'),
'actions_allowed': self.request.user.is_allowed('Specification.Manage'),
})
return context
在我的模板中,我使用模板标签来呈现分页,例如:
{% if is_paginated %}
{{ page_obj|render_paginator }}
{% endif %}
模板标签如下所示:
@register.filter(name='render_paginator')
def paginate_(page_obj):
html = '<div class="d-flex justify-content-between align-items-center flex-wrap">'
html += '<div class="d-flex flex-wrap py-2 mr-3">'
previous_page = (page_obj.number - 1) if (page_obj.number - 1) > 0 else 1
last_page = len(page_obj.paginator.page_range)
next_page = (page_obj.number + 1) if (page_obj.number + 1) <= last_page else last_page
disabled = ''
if page_obj.number == 1:
disabled = ' disabled'
html += '<a href="?page=1" class="btn btn-icon btn-sm btn-light mr-2 my-1{}"><i class="ki ki-bold-double-arrow-back icon-xs"></i></a>'.format(disabled)
html += '<a href="?page={}" class="btn btn-icon btn-sm btn-light mr-2 my-1{}"><i class="ki ki-bold-arrow-back icon-xs"></i></a>'.format(page_obj.previous_page_number, disabled)
for nb in page_obj.paginator.page_range:
active = ''
if page_obj.number == nb:
active = 'btn-hover-primary active'
html += '<a href="?page={}" class="btn btn-icon btn-sm border-0 btn-light {} mr-2 my-1">{}</a>'.format(nb, active, nb)
disabled = ' disabled'
if page_obj.has_next:
disabled = ''
html += '<a href="?page={}" class="btn btn-icon btn-sm btn-light mr-2 my-1{}"><i class="ki ki-bold-arrow-next icon-xs"></i></a>'.format(page_obj.next_page_number, disabled)
html += '<a href="?page={}" class="btn btn-icon btn-sm btn-light mr-2 my-1{}"><i class="ki ki-bold-double-arrow-next icon-xs"></i></a>'.format(page_obj.paginator.num_pages, disabled)
html += '</div>'
html += '<div class="d-flex align-items-center py-3">'
html += '<select id="selLimit" class="form-control form-control-sm font-weight-bold mr-4 border-0 bg-light" style="width: 75px;">'
for i in range(5, 50, 5):
html += '<option value="{}">{}</option>'.format(i, i)
html += '</select>'
html += '</div>'
html += '</div>'
return mark_safe(html)
预先感谢您的任何帮助
解决方案
我找到了答案:当类别被分页时,我必须将类别传递给模板标签,例如:
{% if is_paginated %}
{{ categories|render_paginator }}
{% endif %}
推荐阅读
- python - 验证函数调用其他函数太多次
- node.js - axios.put() 与 formData 反应 axios 不发送 req.params.id === undefined
- python - 高阶函数固定参数。使其固定两个参数相等
- matlab - 为什么从侦听器回调函数中调用保存命令会失败?
- html - HTML:为什么在 _blank 和另一个字符中加下划线
- php - Laravel - 共享数据减少查询次数
- python - 如何为打印语句编写python单元测试?
- sql-server - SAS Sum 每日日期到几周
- android - 为什么要使用低通滤波器来消除加速器上的重力效应?
- javascript - 输入的 Vue/Vuetify 包装器组件不继承 `hide-details` 参数