前言
本章将对前面所学的知识进行一个简单的回顾。
第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入门与实践》