我在模板中使用django paginator.它工作正常,但是当有大量页面时效果不佳.
views.py:
def blog(request):
blogs_list = Blog.objects.all()
paginator = Paginator(blogs_list, 1)
try:
page = int(request.GET.get('page', '1'))
except:
page = 1
try:
blogs = paginator.page(page)
except(EmptyPage, InvalidPage):
blogs = paginator.page(page)
return render(request, 'blogs.html', {
'blogs':blogs
})
Run Code Online (Sandbox Code Playgroud)
模板的片段:
<div class="prev_next">
{% if blogs.has_previous %}
<a class="prev btn btn-info" href="?page={{blogs.previous_page_number}}">Prev</a>
{% endif %}
{% if blogs.has_next %}
<a class="next btn btn-info" href="?page={{blogs.next_page_number}}">Next</a>
{% endif %}
<div class="pages">
<ul>
{% for pg in blogs.paginator.page_range %}
{% if blogs.number == pg %}
<li><a href="?page={{pg}}" …
Run Code Online (Sandbox Code Playgroud) 我刚刚更新到Django Rest Framework 3.1,似乎一切都崩溃了.
在我的serializers.py
我有以下代码:
class TaskSerializer(serializers.ModelSerializer):
class Meta:
model = task
exclude = ('key', ...)
class PaginatedTaskSerializer(pagination.PaginationSerializer):
class Meta:
object_serializer_class = TaskSerializer
Run Code Online (Sandbox Code Playgroud)
哪个工作得很好.现在随着3.1的发布,我无法找到关于如何做同样事情的例子,因为PaginationSerializer
已经不存在了.我试图子类PageNumberPagination
并使用它的默认paginate_queryset
和get_paginated_response
方法,但我不能再将它们的结果序列化.
换句话说,我的问题是我不能再这样做了:
class Meta:
object_serializer_class = TaskSerializer
Run Code Online (Sandbox Code Playgroud)
有任何想法吗?
提前致谢
python django pagination django-pagination django-rest-framework
我的分页模块大部分都在工作,但是有一个问题.我怎样才能显示总可用页面的一部分.例如,假设我在n页的第5页上,我想展示.
1,2,3,4,5,6 ....(N-1)(N).
我相信Ruby有一些花哨的前端魔术来实现这一目标.在django模块中我能做些什么吗?
从其他网站看,似乎逻辑基本上是,选择固定数量的点.如果该数字大于当前显示的数量,请在用户向前翻页时添加项目.达到该点数后,仅在当前页面的左侧和右侧显示x个点.
我应该编写自己的模板逻辑来实现这一目标吗?
谢谢
我们正在为我们的API使用Django REST Framework,我们需要对返回多个项目的关系字段进行分页.
要演示使用类似于文档中的示例:
class TrackSerializer(serializers.ModelSerializer):
class Meta:
model = Track
fields = ('order', 'title')
class AlbumSerializer(serializers.ModelSerializer):
tracks = TrackSerializer(many=True)
class Meta:
model = Album
fields = ('album_name', 'artist', 'tracks')
Run Code Online (Sandbox Code Playgroud)
相册的序列化输出示例:
{
'album_name': 'The Grey Album',
'artist': 'Danger Mouse'
'tracks': [
{'order': 1, 'title': 'Public Service Annoucement'},
{'order': 2, 'title': 'What More Can I Say'},
{'order': 3, 'title': 'Encore'},
...
],
}
Run Code Online (Sandbox Code Playgroud)
如果在专辑中有数百首曲目,则会出现问题.在这种情况下,有没有办法对"曲目"进行分页?
理想情况下,我知道在这种情况下,"轨道"应该指向一个API URL,它只返回特定相册的轨道 - 这反过来可以很容易地分页.该方法的缺点是获得连续前几个轨道所需的额外请求(以及因此延迟等).在我们的例子中,重要的是我们能够通过对Album API的单个请求获得至少一些轨道,然后在需要时动态加载其余轨道.
DRF是否为此提供任何特定功能或模式?或者有任何工作吗?
api django pagination django-pagination django-rest-framework
我目前有一个API视图设置如下:
class CartView(APIView):
authentication_classes = [SessionAuthentication, TokenAuthentication]
permission_classes = [IsAuthenticated, ]
api_view = ['GET', 'POST']
def get(self, request, format=None):
try:
cart = request.user.cart
except Cart.DoesNotExist:
cart = Cart.objects.create(user=request.user)
cart_details = cart.cart_details.all()
serializer = CartDetailSerializer(cart_details, many=True, fields=['id', 'item', 'quantity', 'product_type'])
return Response(serializer.data)
Run Code Online (Sandbox Code Playgroud)
这CartDetailSerializer
是一个普通的ModelSerializer.
我想分页这个API.但是,在DRF的文档中,我发现了这个:
如果您使用常规APIView,则需要自己调用分页API以确保返回分页响应.
没有关于如何对常规APIView API进行分页的示例.
任何人都可以发布一个我可以在上面的场景中使用的例子.
谢谢.
有没有办法使用django的内置分页对rawqueryset进行分页?当我把它投射到列表时,它会在我的脸上抛出一个错误... TypeError:期望的字符串或Unicode对象,找到NoneType.有没有解决的办法?
有没有办法让django分页的页面显示更好?我按照[doc] [1]来创建它,但希望有简单的方法来组织页码显示.
目前,它显示所有页面,比如说我有10页,然后是前
一页1 2 3 4 5 6 7 8 9 10
如果有100,那么它将显示所有100,这是非常疯狂的.
有什么方法可以简单地显示它吗?
例:
上一页1 2 3 ... 67 ... 98,99,100下一张(67是当前页)
prev 1 2 3 ... 65 66 67 68 69 ... 100 next
它不必看起来像上面的示例,但只是不希望它显示每个页面编号没有限制.
就像文档一样,我使用下面的代码创建了我的分页.
模板文件
{% if is_paginated %}
<div id="pagination">
<ul>
{% if page_obj.has_previous %}
<li> <a href="?page={{page_obj.previous_page_number}}">Previous</a> </li>
{% else %}
<li> Previous</li>
{% endif %}
{% for page_number in paginator.num_pages|template_range %}
{% ifequal page_number page_obj.number %}
<li class="currentpage">{{page_number}}</li>
{% else %}
<li> <a …
Run Code Online (Sandbox Code Playgroud) 是否可以在向下滚动时实现facebook样式的内容加载?我想在电子商务网站中实现它.每个类别中有很多项目,类别页面变得太长.我可以实现页码,但我的客户希望我实现facebook类型的加载.有什么我可以用的吗?该网站的其余部分已经建成.
我确实研究过django-endless-pagination但是无法让它工作.有没有它的演示,以便我可以调查它?
我需要进行真正的分页,而不是对所有已检索的数据进行分页.Django文档站点中的示例,如;
def listing(request):
contact_list = Contacts.objects.all()
paginator = Paginator(contact_list, 25) # Show 25 contacts per page
page = request.GET.get('page')
try:
contacts = paginator.page(page)
except PageNotAnInteger:
# If page is not an integer, deliver first page.
contacts = paginator.page(1)
except EmptyPage:
# If page is out of range (e.g. 9999), deliver last page of results.
contacts = paginator.page(paginator.num_pages)
return render_to_response('list.html', {"contacts": contacts})
Run Code Online (Sandbox Code Playgroud)
此代码在所有已检索记录上分页记录.但是有一个麻烦.如果记录太多,试图检索所有记录需要花费很多时间.我需要一个解决方案来从数据库中逐页检索记录.
在Django中有另一种解决方案吗?
有一个创建分页范围的新选项 - get_elided_page_range https://docs.djangoproject.com/en/3.2/ref/paginator/#django.core.paginator.Paginator.get_elided_pa ge_range
我应该如何使用它?如何设置参数?我正在使用 CBV ListView。我尝试了https://nemecek.be/blog/105/how-to-use-elided-pagination-in-django-and-solve-too-many-pages-problem但它对我不起作用。
我有 81 页,当前页是 10。问题是我总是有范围 1 2 3 4 ... 80 81 我做错了什么?
#views.py
class TrailersListView(ListView):
queryset = Trailer.objects.all()
paginate_by = 10
Run Code Online (Sandbox Code Playgroud)
#模板.html
{% for i in paginator.get_elided_page_range %}
{% if page_obj.number == i %}
<li class="active page-item">
<span class="page-link">{{ i }}</span>
</li>
{% else %}
{% if i == paginator.ELLIPSIS %}
<li class="page-item">
<span class="page-link">{{ paginator.ELLIPSIS }}</span>
</li>
{% else %}
<li class="page-item">
<a class="page-link" href="?page={{ i }}">{{ i }}</a> …
Run Code Online (Sandbox Code Playgroud)