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

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

前言

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

第1-2章对Django作了一些简单的介绍与如何安装Django;

第3章完成了程序员入门的重大仪式——Hello World!,写了Django第一个视图函数;然后为了创建一个简单的博客应用;

第4-6章对博客模型进行简单的设计、建立、迁移与操作;

第7章利用Django自带的超级管理员进行博客文章发布;

第8章简单进行模版引擎设置,为了方便后面对模板文件的整合;

第9章能够查看在第7章中发布的文章;

第10-11章对模板文件进行设置,然后把网站重复使用的部分设置成基础模版。

以上都对基本知识讲的比较少,更详细的内容需要研读官方文档。

image.png

主页改版

之前主页是由表格显示的,对于博客网站不是很合理,在参考很多博客设计之后,想着对主页进行改版。改完之后的home页面显示如下:

image.png

修改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入门与实践》

 

相关文章
|
2月前
|
Java API 数据库
Django:从入门到精通
【11月更文挑战第18天】Django是一个由Python编写的高级Web应用框架,以其简洁性、安全性和高效性而闻名。Django最初由Adrian Holovaty和Simon Willison于2003年开发,旨在简化Web应用的开发过程。作为一个开放源代码项目,Django迅速吸引了大量的开发者和用户,成为了Python Web开发领域的重要工具之一。
58 1
|
3月前
|
存储 Shell 数据库
Python编程--Django入门:用户账户(二)
Python编程--Django入门:用户账户(二)
41 2
|
3月前
|
存储 数据库 Python
Python编程--Django入门:用户账户(一)
Python编程--Django入门:用户账户(一)
24 1
|
5月前
|
前端开发 关系型数据库 Python
Django入门到放弃之分页器
Django入门到放弃之分页器
|
5月前
|
数据库 开发者 Java
颠覆传统开发:Hibernate与Spring Boot的集成,让你的开发效率飞跃式提升!
【8月更文挑战第31天】在 Java 开发中,Spring Boot 和 Hibernate 已成为许多开发者的首选技术栈。Spring Boot 简化了配置和部署过程,而 Hibernate 则是一个强大的 ORM 框架,用于管理数据库交互。将两者结合使用,可以极大提升开发效率并构建高性能的现代 Java 应用。本文将通过代码示例展示如何在 Spring Boot 项目中集成 Hibernate,并实现基本的数据库操作,包括添加依赖、配置数据源、创建实体类和仓库接口,以及在服务层和控制器中处理 HTTP 请求。这种组合不仅简化了配置,还提供了一套强大的工具来快速开发现代 Java 应用程序。
317 0
|
5月前
|
开发框架 安全 数据库
解锁Django框架神秘面纱!从入门到实战,掌握这些技巧,让你的Web应用秒变高效神器!
【8月更文挑战第31天】Django 是 Python 的明星 Web 开发框架,以其高效、安全及可扩展性著称,适用于构建各类 Web 应用。本文从 Django 基础概念出发,介绍其 MTV 架构,涵盖模型(Model)、模板(Template)、视图(View)等核心组件,并通过示例代码展示实际应用。此外,还将探讨路由配置、管理界面及实战技巧,帮助读者全面掌握 Django,为高效 Web 开发打下坚实基础。
61 0
|
5月前
|
关系型数据库 MySQL 机器人
Django入门到放弃之数据库配置
Django入门到放弃之数据库配置
|
5月前
|
缓存 中间件 数据库
Django入门到放弃之缓存及信号机制
Django入门到放弃之缓存及信号机制
|
5月前
|
前端开发 数据库 数据安全/隐私保护
Django入门到放弃之Auth模块
Django入门到放弃之Auth模块
|
5月前
|
JSON 前端开发 数据安全/隐私保护
Django入门到放弃之CSRF_TOKEN
Django入门到放弃之CSRF_TOKEN