Wagtail 教程系列 记录了基于 Wagtail 搭建博客站点的整个过程,博客站点 所呈现的即是搭建过程的最新效果。

更多 Wagtail 内容:https://slowread.cn/wagtail-tutorials

此部分属于通用内容,非 Wagtail 必需内容,是为了完善/优化基于 Wagtail 搭建的博客。

引入 Bootstrap 4

http://getbootstrap.com/
https://code.z01.com/v4/

打开上面网址,下载以下文件并放置到相应项目目录下:

/slowread/static/css/bootstrap.min.css

/slowread/static/js/jquery-3.3.1.slim.min.js
/slowread/static/js/popper.min.js
/slowread/static/js/bootstrap.min.js

修改 /slowread/templates/base.html ,加入以下内容:

{# Global stylesheets #}
...
<link rel="stylesheet" type="text/css" href="{% static 'css/slowread.css' %}">
<link href="{% static 'css/bootstrap.min.css' %}" rel="stylesheet" type="text/css">...{# Global javascript #}
...
<script src="{% static 'js/jquery-3.3.1.slim.min.js' %}" type="text/javascript"></script>
<script src="{% static 'js/popper.min.js' %}" type="text/javascript"></script>
<script src="{% static 'js/bootstrap.min.js' %}" type="text/javascript"></script>

引入 Font Awesome

https://fontawesome.com/
https://fontawesome.com/how-to-use/on-the-web/setup/hosting-font-awesome-yourself

下载文件,然后拷贝 /webfonts/css/all.css/slowread/static 目录下,结果如下:

/slowread/static/webfonts/fa-*.* 多个文件
/slowread/static/css/all.min.css 一个文件

修改 /slowread/templates/base.html ,加入以下内容:

{# Global stylesheets #}
...
<link href="{% static 'css/all.min.css' %}" rel="stylesheet" type="text/css">

页头

新建 /slowread/templates/header.html ,内容如下:

<!-- 定义导航栏 -->
<nav class="navbar navbar-expand-lg navbar-dark bg-primary"><div class="container"><!-- 导航栏标识 --><a class="navbar-brand" href="/">慢读 慢生活</a><!-- 导航入口 --><div><ul class="navbar-nav"><!-- 条目 --><li class="nav-item"><a class="nav-link" href="/blog">博客文章</a></li></ul></div></div>
</nav>

页脚

新建 /slowread/templates/footer.html ,内容如下:

<!-- Footer -->
<footer class="py-3 bg-primary"><div class="container"><p class="m-0 text-center text-white">Copyright &copy; <a class="m-0 text-center text-white" href="https://slowread.net">SlowRead.net</a> 2018</p></div>
</footer>

base.html

编辑页面模板文件 /slowread/templates/base.html ,内容如下:

{% load static wagtailuserbar %}<!DOCTYPE html>
<html lang="zh_cn"><head><meta charset="utf-8" /><title>{% block title %}{% if self.seo_title %}{{ self.seo_title }}{% else %}{{ self.title }}{% endif %}{% endblock %}{% block title_suffix %}{% with self.get_site.site_name as site_name %}{% if site_name %}- {{ site_name }}{% endif %}{% endwith %}{% endblock %}</title><meta name="description" content="" /><meta name="viewport" content="width=device-width, initial-scale=1" /><link rel="icon" type="image/png" sizes="32x32" href="{% static 'media/slowread-32x32.ico' %}"><link rel="icon" type="image/png" sizes="16x16" href="{% static 'media/slowread-16x16.ico' %}">{# Global stylesheets #}<link rel="stylesheet" type="text/css" href="{% static 'css/slowread.css' %}"><link href="{% static 'css/bootstrap.min.css' %}" rel="stylesheet" type="text/css"><link href="{% static 'css/all.min.css' %}" rel="stylesheet" type="text/css">{% block extra_css %}{# Override this in templates to add extra stylesheets #}{% endblock %}</head><body class="{% block body_class %}{% endblock %}"><!-- 引入导航栏 -->{% include 'header.html' %}{% wagtailuserbar %}<div class="container">{% block content %}{% endblock %}</div><!-- 引入注脚 -->{% include "footer.html" %}{# Global javascript #}<script type="text/javascript" src="{% static 'js/slowread.js' %}"></script><script src="{% static 'js/jquery-3.3.1.slim.min.js' %}" type="text/javascript"></script><script src="{% static 'js/popper.min.js' %}" type="text/javascript"></script><script src="{% static 'js/bootstrap.min.js' %}" type="text/javascript"></script>{% block extra_js %}{# Override this in templates to add extra javascript #}{% endblock %}</body>
</html>

首页布局

编辑 /slowread/home/models.py ,内容如下:

class HomePage(Page):body = RichTextField(blank=True)def get_context(self, request):# Update context to include only published posts, ordered by reverse-chroncontext = super().get_context(request)page = Page.objects.get(title="文章列表")blogpages = page.get_children().live().order_by('-first_published_at')[:3]context['blogpages'] = blogpagesreturn contextcontent_panels = Page.content_panels + [FieldPanel('body', classname="full"),]

编辑 /slowread/home/templates/home/home_page.html ,内容如下:

{% extends "base.html" %}{% load wagtailcore_tags wagtailimages_tags %}{% block body_class %}template-homepage{% endblock %}{% block content %}<h1 class="mt-2">{{ self.title }}</h1>{{ page.body|richtext }}<hr><div class="card-deck mb-2">{% for post in blogpages %}{% with post=post.specific %}<div class="card" style="width: 18em;">{% with post.main_image as main_image %}{% if main_image %}{% image main_image fill-320x240 as header_image %}<a href="{% pageurl post %}"><img src="{{ header_image.url }}"  class="card-img-top" /></a>{% endif %}{% endwith %}<div class="card-body"><h5 class="card-title"><a href="{% pageurl post %}">{{ post.title }}</a></h5><p class="card-text">{% if post.intro %}{{ post.intro|richtext }}{% else %}{{ post.body|richtext|truncatewords_html:80 }}{% endif %}</p></div><div class="card-footer"><small class="text-muted"><a href="{% pageurl post %}" class="btn btn-primary">阅读全文</a></small></div></div>{% endwith %}{% endfor %}</div><hr><a class="nav-link text-center" href="/blog">更多文章</a><hr>{% endblock %}

文章列表页分页

编辑 /slowread/blog/models.py ,修改 BlogIndexPage 内容如下:

class BlogIndexPage(Page):intro = RichTextField(blank=True)def get_context(self, request):# Update context to include only published posts, ordered by reverse-chroncontext = super().get_context(request)blogpages = self.get_children().live().order_by('-first_published_at')paginator = Paginator(blogpages, 3) # Show 3 resources per pagepage = request.GET.get('page')try:blogpages = paginator.page(page)except PageNotAnInteger:# If page is not an integer, deliver first page.blogpages = paginator.page(1)except EmptyPage:# If page is out of range (e.g. 9999), deliver last page of results.blogpages = paginator.page(paginator.num_pages)# make the variable 'resources' available on the templatecontext['blogpages'] = blogpagesreturn contextcontent_panels = Page.content_panels + [FieldPanel('intro', classname="full")]

采用Boostrap 4 的分页 Pagination 导航样式,编辑 /slowread/blog/templates/blog/blog_index_page.html ,内容如下:

{% extends "base.html" %}{% load wagtailcore_tags wagtailimages_tags %}{% block body_class %}template-blogindexpage{% endblock %}{% block content %}<h1 class="mt-2">{{ page.title }}</h1><!-- <div class="intro">{{ page.intro|richtext }}</div> -->{% for post in blogpages %}{% with post=post.specific %}<div class="card mb-2"><h4 class="card-header"><a href="{% pageurl post %}">{{ post.title }}</a></h4><div class="card-body"><div class="row"><div class="col-auto mr-auto">{% if post.intro %}{{ post.intro|richtext }}{% else %}{{ post.body|richtext|truncatewords_html:80 }}{% endif %}<a href="{% pageurl post %}" class="btn btn-primary mt-2 mb-2">阅读全文</a></div><div class="col-auto">{% with post.main_image as main_image %}{% if main_image %}<a href="{% pageurl post %}">{% image main_image fill-160x100 %}</a>{% endif %}{% endwith %}</div></div></div></div>{% endwith %}{% endfor %}<nav aria-label="Page navigation"><ul class="pagination justify-content-center">{% if blogpages.has_previous %}<li class="page-item"><a class="page-link" href="?page={{ blogpages.previous_page_number }}">&laquo;</a></li>{% endif %}{% for page_num in blogpages.paginator.page_range %}<li {% if page_num == blogpages.number %} class="active page-item"{% endif %}><a class="page-link" href="?page={{ page_num }}">{{ page_num }}</a></li>{% endfor %}{% if blogpages.has_next %}<li class="page-item"><a class="page-link" href="?page={{ blogpages.next_page_number }}">&raquo;</a></li>{% endif %}</ul></nav><hr>{% endblock %}

Wagtail 教程 3:引入 Bootstrap 4,Font Awesome,页面布局优化相关推荐

  1. Springboot项目引入Bootstrap后,图标不能正常显示,报:Failed to decode downloaded font

    springboot项目引入bootstrap后,报:Failed to decode downloaded font,图标不能正常显示 在pom文件中,添加如下配置 <plugin>&l ...

  2. django从零开始引入bootstrap模板

    可能很多人是看完狗书才开始学习django的,但一开始对于自己写django项目引入bootstrap模板很能是件有困难的事 本次博客教程的python版本为3.5,bootstrap版本为3.3.3 ...

  3. 引入Bootstrap方法

    如果你是一名web前端开发工程师或者网页设计师,那么肯定对Bootstrap这个框架早有耳闻,甚至一些web后端工程师也会常常借助Bootstrap的力量来构筑自己心目中理想的web应用. 而在去年年 ...

  4. vue项目中引入bootstrap的方法

    vue项目中引入bootstrap?下面本篇文章给大家介绍一下.有一定的参考价值,有需要的朋友可以参考一下,希望对大家有所帮助. 相关教程推荐:<bootstrap教程> 在 vue 项目 ...

  5. Playmaker Input篇教程之引入的核心概念

    Playmaker Input篇教程之引入的核心概念 Playmaker Input引入的核心概念 Playmaker引入了4个核心概念:状态机.动作.变量和事件.了解它们是学习操作Playmaker ...

  6. 在线引入bootstrap包

    在eclipse中,本地引入一直引入不起,绝对路径和相对路径都不行~所以,现在就先用在线包引入bootstrap.同时bootstrap需要jquery来支持 <link rel="s ...

  7. SSM整合的Maven项目中引入Bootstrap,三步实现高大上插拔UI,后端也有美感

    对比效果 引入bootstrap前 引入bootstrap后 实现 第一步下载并引入bootstrap bootstrap3下载 https://v3.bootcss.com/getting-star ...

  8. laravel mysql视图,在 Laravel 视图文件中引入 bootstrap

    如何在 Laravel 视图文件中引入 bootstrap?对于从来没有接触过 PHP 开发框架的菜鸟来说,这确实是个问题. 在我们这些菜鸟传统的认知里,要在一个 html/php 文件里引入一个外部 ...

  9. angular引用bootstrap_angular怎么引入bootstrap?

    angular中引入bootstrap的方法:方法一.找到index.html直接添加样式引用链接.方法二.打开Angular.json文件找到style和scripts两个配置节.并将bootstr ...

  10. IDEA中引入Bootstrap并展示第一个模板

    在导入bootstrap之前要先导入jQuery 如果你是使用的maven管理的话,可以直接导入jQuery的坐标 <dependency><groupId>org.webja ...

最新文章

  1. 如何打印Qt中的枚举所对应的字符串
  2. (转)Apache Commons工具集简介
  3. MySQL中的二进制类型
  4. 使用IDEA在SpringBoot项目中连接数据库
  5. java实现二分查找-两种方式
  6. 设计模式 日志系统设计_模式:我们设计系统的故事
  7. ElementUI 组件库 md-loader 的解析和优化
  8. [Linux]几个armhf的ubuntu源
  9. [css] 要是position跟display、overflow、float这些特性相互叠加后会怎么样?
  10. 程序员该如何转型 5G 开发?
  11. android 获取mac地址
  12. .h5是什么文件_PPT转H5丨再也不用担心忘带U盘怎么办了
  13. 使用ROW_NUMBER()查询:列名 'RowNumber' 无效。
  14. 技术方案SOW工作文档模板
  15. 3Ds max彻底卸载方法
  16. javascript实现中国地图
  17. 5G技术行业背景2022
  18. 《日语综合教程》第七册 第四課 読み物 初日影のなかで
  19. 查看电脑操作系统版本
  20. Linux驱动——ALSA

热门文章

  1. 对音频信号作短时傅里叶变换(STFT)/小波变换处理(python + matlab)
  2. python 的保留字_Python-保留字(含义)
  3. HBase 过滤器使用
  4. Tableau——备注
  5. 王佩丰excel教程笔记(排序 筛选)
  6. 学习笔记(1):FFmpeg打造Android万能音频播放器-实现变速变调功能(二)
  7. 两向量点乘坐标运算_向量点乘(内积)和叉乘(外积、向量积)概念及几何意义解读...
  8. 2021年工作报告词频词云分析
  9. 张正友标定法过程推导笔记
  10. 计算机在材料科学中的应用实,计算机在材料科学与工程中的应用