Django实现分页算法

先看整体效果:
(索要项目文件的,请评论中留下邮箱,我发给你)
在这里插入图片描述
项目结构:
在这里插入图片描述
准备工作 cmd命令输入

###在cmd命令中输入
adjango-admin startproject page_test2
###跳转到项目目录
cd page_test2
###新建app
python manage.py startapp front

settings.py注册app及templates路径标记

INSTALLED_APPS = [
    'django.contrib.admin',
    'django.contrib.auth',
    'django.contrib.contenttypes',
    'django.contrib.sessions',
    'django.contrib.messages',
    'django.contrib.staticfiles',
    'front']
    
TEMPLATES = [
    {
        'BACKEND': 'django.template.backends.django.DjangoTemplates',
        'DIRS': [os.path.join(BASE_DIR,'templates/')],
        'APP_DIRS': True,
        'OPTIONS': {
            'context_processors': [
                'django.template.context_processors.debug',
                'django.template.context_processors.request',
                'django.contrib.auth.context_processors.auth',
                'django.contrib.messages.context_processors.messages',
            ],
        },
    },
]

项目中的urls.py整合app中的urls.py

from django.urls import path,include

urlpatterns = [
    path('',include("front.urls")),
]

app中的urls.py内容

from django.urls import path
from front import views
app_name = 'front'

urlpatterns = [
    path('bulk_add/',views.bulk_add,name='bulk_add'), 
    path('article_list/',views.ArticleList.as_view(),name='article_list')
]

models.py中新建模型 Article

from django.db import models
class Article(models.Model):
    title = models.CharField(max_length=20)
    content = models.TextField()
    create_time = models.DateTimeField(auto_now_add=True)

views.py中对应函数及类

from django.shortcuts import render
from django.http import HttpResponse
from django.views.generic import ListView

from front.models import Article


def bulk_add(request):  #批量在数据库中生成article数据
    articles = []
    for x in range(102,150):
        article = Article(title='test'+str(x),content='testingcontent'+str(x))
        articles.append(article)
    Article.objects.bulk_create(articles)
    return HttpResponse('success!')


class ArticleList(ListView):
    model = Article
    template_name = 'article_list.html'
    context_object_name = 'articles'
    page_kwarg = 'p'
    paginate_by = 10
    ordering = 'create_time'
    def get_context_data(self, *, object_list=None, **kwargs):
        context =super(ArticleList,self).get_context_data(*kwargs)
        context['username'] = 'testing'
        tem = self.get_page_data(page_obj=context.get('page_obj'),paginator=context.get('paginator'))
        context.update(tem)
        print(context)
        return context

    def get_page_data(self,page_obj,paginator,space=2):
        nums_pages = paginator.num_pages
        current_page = page_obj.number
        left_hasmore = False
        right_hasmore = False

        if current_page <=space+2:
            left_range = range(1,current_page)
        else:
            left_hasmore = True
            left_range = range(current_page-space,current_page)

        if current_page >=nums_pages-space-1:
            right_range = range(current_page+1,nums_pages+1)
        else:
            right_hasmore = True
            right_range = range(current_page+1,current_page+space+1)

        return {
            'nums_pages':nums_pages,
            'current_page':current_page,
            'left_hasmore':left_hasmore,
            'right_hasmore':right_hasmore,
            'left_range':left_range,
            'right_range':right_range
                }

article_list.html内容

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <link rel="stylesheet" href="https://cdn.bootcss.com/bootstrap/3.3.7/css/bootstrap.min.css" integrity="sha384-BVYiiSIFeK1dGmJRAkycuHAHRg32OmUcww7on3RYdg4Va+PmSTsz/K68vbdEjh4u" crossorigin="anonymous">

    <title>书单</title>
</head>
<body>
    {% for article in articles %}
        <ul>
            <li>{{ article.title }}</li>
        </ul>
    {% endfor %}

    <ul class="pagination">
{# 上一页#}
        {% if page_obj.has_previous %}
            <li><a href="{% url 'front:article_list' %}?p={{ page_obj.previous_page_number   }}">上一页</a></li>
        {% else %}
            <li class="disabled"><a href="javascript:void(0);">上一页</a></li>
        {% endif %}


{#中间页#}
    {% if left_hasmore %}
        <li><a href="{% url 'front:article_list' %}?p=1">1</a></li>
        <li><a href="javascript:void(0);">...</a></li>
    {% endif %}

    {% for page in left_range %}
        <li><a href="{% url 'front:article_list' %}?p={{ page }}">{{ page }}</a></li>
    {% endfor %}
        <li class="active"><a href="{% url 'front:article_list'  %}?p={{ current_page }}">{{ current_page }}</a></li>

    {% for page in right_range %}
        <li><a href="{% url 'front:article_list' %}?p={{ page }}">{{ page }}</a></li>    
    {% endfor %}

    {% if right_hasmore %}
        <li><a href="javascript:void(0);">...</a></li>
        <li><a href="{% url 'front:article_list' %}?p={{ nums_pages }}">{{ nums_pages }}</a></li>
    {% endif %}
    

{#下一页#}
        {% if page_obj.has_next %}
            <li><a href="{% url 'front:article_list' %}?p={{ page_obj.next_page_number }}">下一页</a></li>
        {% else %}
            <li class="disabled"><a href="javascript:void(0);">下一页</a></li>
        {% endif %}

    </ul>

</body>
</html>

在批量插入数据之前,注意先建立映射:

##cmd命令中分别输入
python manage.py makemigrations
python manage.py migrate
  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值