前言
本章将对前面所学的知识进行一个简单的回顾。
第1-2章对Django作了一些简单的介绍与如何安装Django;
第3章完成了程序员入门的重大仪式——Hello World!
,写了Django第一个视图函数;然后为了创建一个简单的博客应用;
第4-6章对博客模型进行简单的设计、建立、迁移与操作;
第7章利用Django自带的超级管理员进行博客文章发布;
第8章简单进行模版引擎设置,为了方便后面对模板文件的整合;
第9章能够查看在第7章中发布的文章;
第10-11章对模板文件进行设置,然后把网站重复使用的部分设置成基础模版。
以上都对基本知识讲的比较少,更详细的内容需要研读官方文档。
主页改版
之前主页是由表格显示的,对于博客网站不是很合理,在参考很多博客设计之后,想着对主页进行改版。改完之后的home
页面显示如下:
修改base.html
在导航页增加了一个登录选项,为下一章做铺垫。
{% load staticfiles %} <!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <title>{% block title %}{% endblock %}</title> <link rel="stylesheet" href="{% static 'css/bootstrap.min.css' %}"> </head> <body> <div id="header"> <nav class="navbar navbar-expand-lg navbar-dark bg-dark"> <div class="container" > <a class="navbar-expand" href="{% url 'home' %}">主页</a> <ul class="nav navbar-nav navbar-light" style="margin-right: 10px"> <li><a href="#">登录</a> </li> </ul> </div> </nav> </div> <div class="container"> <div id="content"> {% block content %} {% endblock %} </div> </div> </body> </html>
修改home.html
{% extends 'base.html' %} {% block title %} 主页 {% endblock %} {% block content %} <h1>博客首页</h1> {% for blog in blogs %} <h2> <a href="{{ blog.id }}">{{ blog.title }} </a> </h2> <p class="date"> Posted by {{ blog.author.username }} on {{ blog.publish }} </p> {{ blog.body|truncatewords:30|linebreaks }} {% endfor %} {% endblock %}
解释:truncatewords
用来截断指定数量的文字,linebreaks
将结果带上一个HTML换行。
添加分页功能
当输入一些文章后,就会需要将文章分页进行显示,Django自带了一个分页器。
编辑blog/views.py
文件,修改home
函数:
from django.shortcuts import render, get_object_or_404 from .models import BlogArticles from django.core.paginator import Paginator, EmptyPage, PageNotAnInteger # Create your views here. def home(request): object_list = BlogArticles.objects.all() paginator = Paginator(object_list, 5) page = request.GET.get('page') try: blogs = paginator.page(page) except PageNotAnInteger: # 如果page参数不是一个整数就返回第一页 blogs = paginator.page(1) except EmptyPage: # 如果页数超过总页数就返回最后一页 blogs = paginator.page(paginator.num_pages) return render(request, "home.html", {"page": page, "blogs": blogs}) def blog_article(request, article_id): # article = BlogArticles.objects.get(id=article_id) article = get_object_or_404(BlogArticles, id=article_id) publish_time = article.publish return render(request, "content.html", {"article": article, "publish": publish_time})
分页器相关代码解释如下:
- 使用要分页的内容和每页要展示的内容数量,实例化
Paginator
类得到paginator
对象 - 通过
get()
方法获取page变量,表示当前的页码 - 调用
paginator.page()
方法获取要展示的数据 - 如果
page
参数不是一个整数就返回第一页,如果页数超过总页数就返回最后一页 - 把页码和要展示的内容传给页面。
为分页功能创建一个单独的模板,可以让该模版用在任何使用分页功能的页面中,在blog/templates/
目录中新建一个pagination.html
,编写如下代码:
<div class="pagination"> <span class="step-links"> {% if page.has_previous %} <a href="?page={{ page.previous_page_number }}">前一页</a> {% endif %} <span class="current"> Page {{ page.number }} of {{ page.paginator.num_pages }}. </span> {% if page.has_next %} <a href="?page={{ page.next_page_number }}">后一页</a> {% endif %} </span> </div>
然后回到blog/templates/home.html
文字,添加分页功能实现完毕:
{% extends 'base.html' %} {% block title %} 主页 {% endblock %} {% block content %} <h1>博客首页</h1> {% for blog in blogs %} <h2> <a href="{{ blog.id }}">{{ blog.title }} </a> </h2> <p class="date"> Posted by {{ blog.author.username }} on {{ blog.publish }} </p> {{ blog.body|truncatewords:30|linebreaks }} {% endfor %} {% include 'pagination.html' with page=blogs %} # 新增 {% endblock %}
参考资料
- 《Django2 by Example》
- 《Django入门与实践》