基类模板抽取

分析

  • 在打开新闻详情页之后,观察很容易得出详情面和首页有相同的东西,
  • 顶部 icon 和登录注册,右侧点击排行,底部网站信息等
  • 可以将共同内容抽取到基类模板中,再使用其他模板继承基类模板

抽取

  • 在模板文件夹下创建 base.html
    • 将首页内容全部拷贝到该文件中,将特有的东西留作 block 给子模板实现
    • 抽取出来的block为:
      • 标题
      • script内容
      • 顶部中心
      • 页面内容
      • 点击排行div中的作者信息
    • 具体见以下代码
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>{% block titleBlock %}新经资讯网{% endblock %}</title>
    <link rel="stylesheet" type="text/css" href="../../static/news/css/reset.css">
    <link rel="stylesheet" type="text/css" href="../../static/news/css/main.css">
    <script type="text/javascript" src="../../static/news/js/jquery-1.12.4.min.js"></script>
    <script type="text/javascript" src="../../static/news/js/main.js"></script>
    {% block scriptBlock %}{% endblock %}
</head>
<body>
    <div class="header_con">
        <div class="header">
            <a href="#" class="logo fl"><img src="../../static/news/images/logo.png" alt="logo"></a>

            {% block headerBlock %}

            {% endblock %}

            {# 判断用户是否登录 #}
            {% if data.user_info %}
                {# 如果登录,则显示用户信息 #}
                <div class="user_login fr">
                    <img src="{% if data.user_info.avatar_url %} {{ data.user_info.avatar_url }} {% else %}../../static/news/images/person01.png{% endif %}" class="lgin_pic">
                    <a href="#">{{ data.user_info.nick_name }}</a>
                    <a href="#">退出</a>
                </div>
            {% else %}
                {# 如果没有登录,则显示登录注册按钮 #}
                <div class="user_btns fr">
                    <a href="javascript:;" class="login_btn">登录</a> / <a href="javascript:;" class="register_btn">注册</a>
                </div>
            {% endif %}
        </div>
    </div>

    <div class="conter_con">
        {% block contentBlock %}

        {% endblock %}
        {% block rankBlock %}
            <div class="rank_con fr">
                {% block contentBlock %}

                {% endblock %}
                <div class="rank_title">
                    <h3>点击排行</h3>
                </div>
                <ul class="rank_list">
                    {% for news in data.click_news_list %}
                        <li><span class="{{ loop.index0 | index_class }}">{{ loop.index }}</span><a href="/news/{{ news.id }}" target="_blank">{{ news.title }}</a></li>
                    {% endfor %}
                </ul>
            </div>
        {% endblock %}
    </div>

    <div class="footer">
        <div class="footer_links">
            <a href="">关于我们</a>
            <span>|</span>
            <a href="">联系我们</a>
            <span>|</span>
            <a href="">招聘人才</a>
            <span>|</span>
            <a href="">友情链接</a>
        </div>
        <p class="copyright">
            CopyRight © 2018 新经资讯信息技术有限公司 All Rights Reserved<br />
电话:010-****888    京ICP备*******8号
        </p>
    </div>

    <!-- 登录表单 -->
    <form class="login_form_con"...>

    <!-- 注册表单 -->
    <form class="register_form_con"...>
</body>
</html>
  • index.html 继承实现为:
{% extends 'news/base.html' %}

{% block titleBlock %}
首页-新经资讯
{% endblock %}

{% block scriptBlock %}
<script type="text/javascript" src="../../static/news/js/index.js"></script>
{% endblock %}

{% block headerBlock %}
<ul class="menu fl">
    {% for category in data.categories %}
        <li class="{% if category.active %}active{% endif %}" data-cid="{{ category.id }}"><a href="javascript:;">{{ category.name }}</a></li>
    {% endfor %}
</ul>
{% endblock %}

{% block contentBlock %}
<ul class="list_con fl">
</ul>
{% endblock %}

运行测试

  • detail.html 继承实现为:
{% extends 'news/base.html' %}
{% block titleBlock %}
文章详情页
{% endblock %}

{% block contentBlock %}
<div class="detail_con fl"...>
{% endblock %}

{% block authorBlock %}
<div class="author_card"...>
{% endblock %}
  • 在详情页的视图函数添加数据传递(为了测试运行)
@news_blu.route('/<int:news_id>')
def news_detail(news_id):
    data = {}
    return render_template('news/detail.html', data=data)

运行测试