大家好,在这篇文章中,我们将展示django的分页完整的一个实例,当我们打算用Django中开发博客时,需要将帖子列表分别展示到多个页面上,在这方面,Django具有内置的分页类,可管理分页数据。所有分页方法都使用Paginator类。它实际上是承担将QuerySet拆分为Page对象的工作。在django中可以使用两种方法进行分页,第一种方法是使用基于函数的视图,第二种方法是使用基于类的视图。
现在,首先,需要使用此命令创建一个新的django项目。我称这个项目为MyProject
现在,首先,需要在应用程序中打开models.py文件并创建模型。
现在,这是我们的pagination.html文件。
因此,对于基于类的视图分页,我们需要像这样在views.py文件中进行一些更改。
现在,在此之后,需要打开urls.py并注释上一个视图,并添加基于类的视图
完毕,希望这篇对大家学习有帮助。
现在,首先,需要使用此命令创建一个新的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
这将是分页的结果。
因此,对于基于类的视图分页,我们需要像这样在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 %}
因此,如果运行项目,结果跟上面截图是一样的。
完毕,希望这篇对大家学习有帮助。