django - django分页页面中不同数量的记录
问题描述
我正在尝试在第一页(5)和所有其他页面(最多 6 个)上用不同的东西进行分页以最大化元素。我喜欢这个答案
class MyPaginator(Paginator):
def __init__(self, **kw):
self.deltafirst = kw.pop('deltafirst', 0)
Paginator.__init__(self, **kw)
def page(self, number):
number = self.validate_number(number)
if number == 1:
bottom = 0
top = self.per_page - self.deltafirst
else:
bottom = (number - 1) * self.per_page - self.deltafirst
top = bottom + self.per_page
if top + self.orphans >= self.count:
top = self.count
return Page(self.object_list[bottom:top], number, self)
from django.core.paginator import Paginator
from django.core.paginator import EmptyPage
from django.core.paginator import PageNotAnInteger
class NewsView(ListView):
model = News
template_name="mysite/news.html"
paginate_by = 5
def get_context_data(self, **kwargs):
context = super(NewsView, self).get_context_data(**kwargs)
all_news = News.objects.all().order_by("-date_news")
paginator = MyPaginator(all_news, self.paginate_by,deltafirst=1)
page = self.request.GET.get('page')
try:
file_exams = paginator.page(page)
except PageNotAnInteger:
file_exams = paginator.page(1)
except EmptyPage:
file_exams = paginator.page(paginator.num_pages)
context['all_news'] = file_exams
return context
但我得到一个错误,我无法弄清楚我做错了什么。错误本身
paginator = MyPaginator(all_news, self.paginate_by,deltafirst=1)
TypeError: __init__() takes 1 positional argument but 3 were given
解决方案
首先更改您的__init__
方法MyPaginator
以修复错误:
from math import ceil
class MyPaginator(Paginator):
def __init__(self, *args, **kw):
self.deltafirst = kw.pop('deltafirst', 0)
super().__init__(*args, **kw)
def page(self, number):
number = self.validate_number(number)
if number == 1:
bottom = 0
top = self.per_page - self.deltafirst
else:
bottom = (number - 1) * self.per_page - self.deltafirst
top = bottom + self.per_page
if top + self.orphans >= self.count:
top = self.count
return Page(self.object_list[bottom:top], number, self)
@property
def num_pages(self):
if self.count == 0 and not self.allow_empty_first_page:
return 0
count = max(self.count - self.per_page + self.deltafirst, 0)
hits = max(0, count - self.orphans)
return 1 + ceil(hits / self.per_page)
接下来使您的视图更简单,而不是覆盖get_context_data
overrideget_paginator
并将其设置deltafirst
为类属性:
class NewsView(ListView):
model = News
template_name="mysite/news.html"
paginate_by = 5
paginator_class = MyPaginator
deltafirst = 1
def get_paginator(self, *args, **kwargs):
if self.deltafirst:
kwargs['deltafirst'] = self.deltafirst
return super().get_paginator(*args, **kwargs)
推荐阅读
- javascript - 单击 JS 时隐藏/显示元素无法正常工作
- c# - C# Linq - 按相同属性的计数对 IEnumerable 进行排序
- memory-leaks - 使用 CGAL 精确内核的内存泄漏
- angular - URL中的角度隐藏基本href
- kubernetes - 具有 Kubernetes 集群的 Istio 和 Celery 工作人员
- c++ - 带有小数组的删除 [] 上的 SIGTRAP
- python - 使用不同的字符串重复脚本 - Python
- flutter - 使用扩展无状态小部件的方法或单独的类来分离我的小部件是否更有效?
- javascript - 自定义子类中的 Fabric.js 文本无法正确缩放
- c# - Kafka 是否允许异步读取消息内容?