bootstrap分页_Django分页完整示例

大家好,在这篇文章中,我们将展示django的分页完整的一个实例,当我们打算用Django中开发博客时,需要将帖子列表分别展示到多个页面上,在这方面,Django具有内置的分页类,可管理分页数据。所有分页方法都使用Paginator类。它实际上是承担将QuerySet拆分为Page对象的工作。在django中可以使用两种方法进行分页,第一种方法是使用基于函数的视图,第二种方法是使用基于类的视图。
现在,首先,需要使用此命令创建一个新的django项目。我称这个项目为MyProject
django-admin startproject ProjectName
首先,需要将目录更改为已创建的项目,然后需要创建一个App,我将其称为MyApp。
python manage.py startapp MyApp
另外,还需要在settings.py(INSTALLED_APPS)中添加新创建的应用。
INSTALLED_APPS = [    'django.contrib.admin',    'django.contrib.auth',    'django.contrib.contenttypes',    'django.contrib.sessions',    'django.contrib.messages',    'django.contrib.staticfiles',    'MyApp']
在此之后进行数据库迁移:
python manage.py migrate
另外,还需要创建一个模板文件夹,因为我们需要向模板文件夹中添加一些html文件,请确保在创建模板文件夹后需要打开settings.py并将模板目录添加到DIRS部分中,如下所示。
TEMPLATES = [    {        'BACKEND': 'django.template.backends.django.DjangoTemplates',        'DIRS': ['templates'],
1:基于函数的视图中的分页
现在,首先,需要在应用程序中打开models.py文件并创建模型。
from django.db import modelsfrom django.utils import timezone# Create your models here.class Post(models.Model):    title = models.CharField(max_length=100)    author = models.CharField(max_length=100)    body = models.TextField()    publish = models.DateTimeField(default=timezone.now())    def __str__(self):        return self.title
基本上,我们有一个具有四个没有id的字段的模型。之后,需要进行这样的迁移。
python manage.py makemigrationspython manage.py migrate
首先,需要打开views.py文件并创建视图功能。
from django.shortcuts import renderfrom .models import Postfrom django.core.paginator import Paginator, EmptyPage, PageNotAnInteger# Create your views here.def Index(request):    post_list = Post.objects.all()    paginator = Paginator(post_list, 2)    page = request.GET.get('page')    try:        posts = paginator.page(page)    except PageNotAnInteger:        posts = paginator.page(1)    except EmptyPage:        posts = paginator.page(paginator.num_pages)    return render(request, 'index.html', {'page':page,'posts':posts})
可以看到我们已经在索引视图功能中完成了分页确定,现在需要在创建的应用程序中创建一个新的urls.py。并链接您的视图功能,像这样:
from django.urls import pathfrom .views import Indexurlpatterns = [    path('', Index),]
而且还需要像这样在主项目urls.py中包含应用程序urls.py
from django.contrib import adminfrom django.urls import path, includeurlpatterns = [    path('admin/', admin.site.urls),    path('', include('MyApp.urls'))]
现在,在的模板文件夹中,需要创建两个这样的html文件。
<html lang="en"><head>    <meta charset="UTF-8">    <title>Titletitle>    <link rel="stylesheet" href="https://stackpath.bootstrapcdn.com/bootstrap/4.4.1/css/bootstrap.min.css" integrity="sha384-Vkoo8x4CGsO3+Hhxv8T/Q5PaXtkKtu6ug5TOeNV6gBiFeWPGFN9MuhOf23Q9Ifjh" crossorigin="anonymous">head><body><div class = "jumbotron">    {% for post in posts %}    <h1 class="display-4">{{post.title}}h1>    Published {{post.publish}} by {{post.author}}    {{post.body|truncatewords:30|linebreaks}}    <hr class="my-4">    {% endfor %}div>{%  include  "pagination.html"  with  page=posts  %}body>html>
所以这是我们的索引html文件,也可以在顶部看到我添加了Bootstrap CDN链接,因为我将使用一些bootstrap样式进行分页。该代码用于包含我们尚未创建的分页文件。
{%  include  "pagination.html"  with  page=posts  %}
由于我们传递给模板的Page对象称为帖子,因此我们将分页模板包括在帖子列表模板中,并传递参数以正确呈现它。可以按照此方法在不同模型的分页视图中重用分页模板。
现在,这是我们的pagination.html文件。
"Page navigation example" >    
class= class= {% if page.has_previous %} class= {% endif %} class= class= class= {% if page.has_next %} class= {% endif %} 现在可以运行的项目,将看到分页。
python manage.py runserver
这将是分页的结果。

326ec699ee04686d9319ccdff710473f.png

2:基于类的视图分页
因此,对于基于类的视图分页,我们需要像这样在views.py文件中进行一些更改。
from django.shortcuts import renderfrom .models import Postfrom django.core.paginator import Paginator, EmptyPage, PageNotAnIntegerfrom django.views.generic import ListView# Create your views here.'''def Index(request):    post_list = Post.objects.all()    paginator = Paginator(post_list, 2)    page = request.GET.get('page')    try:        posts = paginator.page(page)    except PageNotAnInteger:        posts = paginator.page(1)    except EmptyPage:        posts = paginator.page(paginator.num_pages)    return render(request, 'index.html', {'page':page,'posts':posts})'''class PostList(ListView):    queryset = Post.objects.all()    context_object_name = 'posts'    paginate_by = 2    template_name = 'index.html'
django.views.generic.list.ListView提供了一种内置的方法来对显示的列表进行分页。可以通过在视图类中添加paginate_by属性来实现此目的,这会限制每页的对象数,并向上下文中添加paginator和page_obj。要允许用户在页面之间导航,请在模板中添加指向下一页和上一页的链接。
现在,在此之后,需要打开urls.py并注释上一个视图,并添加基于类的视图
from django.urls import pathfrom .views import  PostListurlpatterns = [    #path('', Index),    path('', PostList.as_view())]
可以在顶部看到我们已经导入了PostList,为了保持分页功能,我们必须使用正确的页面。传递给模板的对象。Django的ListView通用视图将所选页面传递到名为page_obj的变量中,因此必须相应地编辑index.html模板,以使用正确的变量包括分页器,如下所示:
{% include 'pagination.html' with page=page_obj %}
因此,如果运行项目,结果跟上面截图是一样的。
完毕,希望这篇对大家学习有帮助。
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值