Wagtail 教程 3:引入 Bootstrap 4,F(xiàn)ont Awesome夷陋,頁面布局優(yōu)化

Wagtail 教程系列 記錄了基于 Wagtail 搭建博客站點(diǎn)的整個過程欠拾,博客站點(diǎn) 所呈現(xiàn)的即是搭建過程的最新效果。

更多 Wagtail 內(nèi)容:https://slowread.cn/wagtail-tutorials

此部分屬于通用內(nèi)容骗绕,非 Wagtail 必需內(nèi)容藐窄,是為了完善/優(yōu)化基于 Wagtail 搭建的博客。

引入 Bootstrap 4

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

打開上面網(wǎng)址酬土,下載以下文件并放置到相應(yīng)項(xiàng)目目錄下:

/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 荆忍,加入以下內(nèi)容:

{# 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 目錄下,結(jié)果如下:

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

修改 /slowread/templates/base.html 刹枉,加入以下內(nèi)容:

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

頁頭

新建 /slowread/templates/header.html 叽唱,內(nèi)容如下:

<!-- 定義導(dǎo)航欄 -->
<nav class="navbar navbar-expand-lg navbar-dark bg-primary">
  <div class="container">

    <!-- 導(dǎo)航欄標(biāo)識 -->
    <a class="navbar-brand" href="/">慢讀 慢生活</a>

    <!-- 導(dǎo)航入口 -->
    <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 ,內(nèi)容如下:

<!-- 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" >SlowRead.net</a> 2018</p>
    </div>
</footer>

base.html

編輯頁面模板文件 /slowread/templates/base.html 微宝,內(nèi)容如下:

{% 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 %}">
        <!-- 引入導(dǎo)航欄 -->
        {% 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 棺亭,內(nèi)容如下:

class HomePage(Page):
    body = RichTextField(blank=True)

    def get_context(self, request):
        # Update context to include only published posts, ordered by reverse-chron
        context = super().get_context(request)
        page = Page.objects.get(title="文章列表")
        blogpages = page.get_children().live().order_by('-first_published_at')[:3]
        context['blogpages'] = blogpages
        return context

    content_panels = Page.content_panels + [
        FieldPanel('body', classname="full"),
    ]

編輯 /slowread/home/templates/home/home_page.html ,內(nèi)容如下:

{% 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 內(nèi)容如下:

class BlogIndexPage(Page):
    intro = RichTextField(blank=True)

    def get_context(self, request):
        # Update context to include only published posts, ordered by reverse-chron
        context = super().get_context(request)
        blogpages = self.get_children().live().order_by('-first_published_at')

        paginator = Paginator(blogpages, 3) # Show 3 resources per page

        page = 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 template
        context['blogpages'] = blogpages
        return context

    content_panels = Page.content_panels + [
        FieldPanel('intro', classname="full")
    ]

采用Boostrap 4 的分頁 Pagination 導(dǎo)航樣式侦铜,編輯 /slowread/blog/templates/blog/blog_index_page.html ,內(nèi)容如下:

{% 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 %}
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末钟鸵,一起剝皮案震驚了整個濱河市钉稍,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌棺耍,老刑警劉巖贡未,帶你破解...
    沈念sama閱讀 210,978評論 6 490
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異蒙袍,居然都是意外死亡俊卤,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 89,954評論 2 384
  • 文/潘曉璐 我一進(jìn)店門害幅,熙熙樓的掌柜王于貴愁眉苦臉地迎上來消恍,“玉大人,你說我怎么就攤上這事以现『菰梗” “怎么了?”我有些...
    開封第一講書人閱讀 156,623評論 0 345
  • 文/不壞的土叔 我叫張陵邑遏,是天一觀的道長佣赖。 經(jīng)常有香客問我,道長记盒,這世上最難降的妖魔是什么憎蛤? 我笑而不...
    開封第一講書人閱讀 56,324評論 1 282
  • 正文 為了忘掉前任,我火速辦了婚禮纪吮,結(jié)果婚禮上俩檬,老公的妹妹穿的比我還像新娘。我一直安慰自己碾盟,他們只是感情好棚辽,可當(dāng)我...
    茶點(diǎn)故事閱讀 65,390評論 5 384
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著巷疼,像睡著了一般晚胡。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上嚼沿,一...
    開封第一講書人閱讀 49,741評論 1 289
  • 那天估盘,我揣著相機(jī)與錄音,去河邊找鬼骡尽。 笑死遣妥,一個胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的攀细。 我是一名探鬼主播箫踩,決...
    沈念sama閱讀 38,892評論 3 405
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼谭贪!你這毒婦竟也來了境钟?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 37,655評論 0 266
  • 序言:老撾萬榮一對情侶失蹤俭识,失蹤者是張志新(化名)和其女友劉穎慨削,沒想到半個月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體套媚,經(jīng)...
    沈念sama閱讀 44,104評論 1 303
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡缚态,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,451評論 2 325
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了堤瘤。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片玫芦。...
    茶點(diǎn)故事閱讀 38,569評論 1 340
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖本辐,靈堂內(nèi)的尸體忽然破棺而出桥帆,到底是詐尸還是另有隱情,我是刑警寧澤慎皱,帶...
    沈念sama閱讀 34,254評論 4 328
  • 正文 年R本政府宣布环葵,位于F島的核電站,受9級特大地震影響宝冕,放射性物質(zhì)發(fā)生泄漏张遭。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,834評論 3 312
  • 文/蒙蒙 一地梨、第九天 我趴在偏房一處隱蔽的房頂上張望菊卷。 院中可真熱鬧,春花似錦宝剖、人聲如沸洁闰。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,725評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽扑眉。三九已至,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間腰素,已是汗流浹背聘裁。 一陣腳步聲響...
    開封第一講書人閱讀 31,950評論 1 264
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留弓千,地道東北人衡便。 一個月前我還...
    沈念sama閱讀 46,260評論 2 360
  • 正文 我出身青樓,卻偏偏與公主長得像洋访,于是被迫代替她去往敵國和親镣陕。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 43,446評論 2 348

推薦閱讀更多精彩內(nèi)容

  • 第一部分 HTML&CSS整理答案 1. 什么是HTML5姻政? 答:HTML5是最新的HTML標(biāo)準(zhǔn)呆抑。 注意:講述HT...
    kismetajun閱讀 27,445評論 1 45
  • 模塊間聯(lián)系越多,其耦合性越強(qiáng)汁展,同時表明其獨(dú)立性越差( 降低耦合性理肺,可以提高其獨(dú)立性)。軟件設(shè)計中通常用耦合度和內(nèi)聚...
    riverstation閱讀 2,063評論 0 8
  • 1 Webpack 1.1 概念簡介 1.1.1 WebPack是什么 1善镰、一個打包工具 2妹萨、一個模塊加載工具 3...
    Kevin_Junbaozi閱讀 6,642評論 0 16
  • 1 你說你被你愛的人改變,變得濫情炫欺。 我說我被愛我的人改變乎完,變得深情。 你說你遇到了太多人渣和狗品洛,不相信什么山高水...
    丑苗閱讀 507評論 4 6
  • 國慶節(jié)就近跑去了青島一個獨(dú)特的海邊城市 攝影:珞書 杜杜杜出鏡:陌生人們树姨,侵刪。后期:珞書 杜杜杜地點(diǎn):青島時間:...
    珞書閱讀 574評論 0 2