Django html 分页
admin
2023-08-03 14:00:08
0


16.分页

django 自带的分页:django paginator

参考:https://docs.djangoproject.com/en/1.10/topics/pagination/

>>> from django.core.paginator import Paginator
>>> objects = ['john', 'paul', 'george', 'ringo']
>>> p = Paginator(objects, 2)

>>> p.count
4
>>> p.num_pages     ##一共多少页,也可说是最后一页的页数
2
>>> p.page_range
[1, 2]
>>>

>>> page1 = p.page(1)
>>> page1

>>> page1.object_list
['john', 'paul']

>>> page2 = p.page(2)
>>> page2.object_list
['george', 'ringo']
>>> page2.has_next()
False
>>> page2.has_previous()
True
>>> page2.has_other_pages()
True
>>> page2.next_page_number()
Traceback (most recent call last):
...
EmptyPage: That page contains no results
>>> page2.previous_page_number()
1
>>> page2.start_index() # The 1-based index of the first item on this page
3
>>> page2.end_index() # The 1-based index of the last item on this page
4
>>> p.page(0)
Traceback (most recent call last):
...
EmptyPage: That page number is less than 1
>>> p.page(3)
Traceback (most recent call last):
...
EmptyPage: That page contains no results

###################################
###################################
###################################  后端处理
from django.core.paginator import Paginator, EmptyPage, PageNotAnInteger
from django.shortcuts import render

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(request, 'list.html', {'contacts': contacts})    ##把获取到的页面返回到前台



###################################
###################################
###################################  前端处理

{% for contact in contacts %}
    {# Each "contact" is a Contact model object. #}
    {{ contact.full_name|upper }}
    ...
{% endfor %}


    
        {% if contacts.has_previous %}      ##判断后端传来的页数,有没有上一页
            previous
        {% endif %}

        
            Page {{ contacts.number }} of {{ contacts.paginator.num_pages }}.
        

        {% if contacts.has_next %}  ##判断后端传来的页数,有没有下一页
            next
        {% endif %}    ### ?page ,加上'?'问号。 就是一个get方法。
    
################################### ################################### ###################################  前端处理,用bootstrap 实现, 作业:线上分页中的前后几页,而不是下面的全部页面都显示                     



下面这个实例,分页页面按钮数最多显示为3个!

实例:
后端:
def index(request):   ##分页
    articles_list = models.Article.objects.all().order_by('-publish_date')  ###把内容取出来,但不是真正取出去。
    paginator = Paginator(articles_list, 2) # Show 2 contacts per page

    page = request.GET.get('page')     ##前台说要去那一页,就提交到这
    try:
        articles = paginator.page(page)
    except PageNotAnInteger:
        # If page is not an integer, deliver first page.  ##如果页面不是一个整数,交付第一页
        articles = paginator.page(1)
    except EmptyPage:
        # If page is out of range (e.g. 9999), deliver last page of results.
        articles = paginator.page(paginator.num_pages) ##如果取的页数超过最大页数,就返回最后一页

    page_range = range(articles.number - 1 ,articles.number + 2)
    max_page = paginator.num_pages
    return render(request,'index.html',{
        'articles': articles,
        'page_range': page_range,
        'max_page': max_page,
    })

前端:


    {% if articles.has_previous %}
        
  • previous         
  •     {% endif %}     {% for p_num in page_range %}         {% if 0 < p_num and p_num < max_page %}             {% if articles.number == p_num %}                                                   {{ articles.number }}                 {{ articles.number }}                                                                {% else %}                                                       {{ p_num }}                                               {% endif %}         {% endif %}     {% endfor %}               {% if articles.has_next %}         
  • next
  •     {% endif %}
    
    
        {% if articles.has_previous %}
            
  • «         
  •     {% else %}         «     {% endif %}     {% for p_num in page_range %}         {% if 0 < p_num and p_num < max_page %}             {% if articles.number == p_num %}                                                   {{ articles.number }}                 {{ articles.number }}                                                                {% else %}                                                       {{ p_num }}                                               {% endif %}         {% endif %}     {% endfor %}     {% if articles.has_next %}         
  • »
  •         {% else %}         »     {% endif %}


    相关内容

    热门资讯

    山东济宁:让机器人“跑”进千行... 盛夏时节,孔孟之乡迎来一场科技与产业深度交融的大会。7月11日至13日,由山东省机器人行业协会、中国...
    外交部亚洲司负责人就日方涉“南... 2026年7月12日,外交部亚洲司负责人就日本外相炒作“南海仲裁案裁决”出台十年发表谈话、日伙同他国...
    全球首款可变形个人机器人,上纬... IT之家 7 月 12 日消息,上纬新材今日发布启元 T1 实机视频,号称“全球首款可变形个人机器人...
    腾讯重仓一个IPO 图片来源:视觉中国 作者/杨继云 报道/投资界PEdaily 深圳超级IPO来了。 日前,深圳云豹智...
    乌方称“俄军9成导弹和无人机有... 近日,乌克兰总统顾问弗拉修克在接受日本共同社的采访时声称,俄军在进攻乌克兰时使用的巡航和弹道导弹及无...
    美国驻阿曼使馆发布“就地避险”... 当地时间7月12日,美国驻阿曼大使馆向阿曼境内部分地区发布“就地避险”提醒。美国驻阿曼使馆表示,鉴于...
    风雨里的守望——广西防汛抗洪一... ↑ 7月11日,在通往广西南宁横州市镇龙乡的道路上,救援人员徒步向受困地区进发(无人机照片)。近期,...
    特大暴雨!“巴威”即将进入安徽... 今年第9号台风“巴威”登陆后深入内陆,将携大量水汽影响安徽,今明两天(7月12日至13日)为台风雨核...
    油烟机自动翻盖打不开了 油烟机自动翻盖打不开了的原因有三个。第一,可能是控制面板故障或者附着的油污太多了。第二,油烟机控制系...
    万家乐油烟机按键失灵是什么原因 万家乐油烟机按键失灵是什么原因可能是因为受潮影响,机器内部进水导致触摸按键失灵,首先检查电源板各电压...