Django入门:第十二章、回顾与主页改版

前言

本章将对前面所学的知识进行一个简单的回顾。

第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})

分页器相关代码解释如下:

  1. 使用要分页的内容和每页要展示的内容数量,实例化Paginator类得到paginator对象
  2. 通过get()方法获取page变量,表示当前的页码
  3. 调用paginator.page()方法获取要展示的数据
  4. 如果page参数不是一个整数就返回第一页,如果页数超过总页数就返回最后一页
  5. 把页码和要展示的内容传给页面。

为分页功能创建一个单独的模板,可以让该模版用在任何使用分页功能的页面中,在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 %}

参考资料

  1. 《Django2 by Example》
  2. 《Django入门与实践》
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值