1. 程式人生 > >Django 模板繼承

Django 模板繼承

django 模板繼承

在Django網頁開發中,一個網站的不同頁面都存在大量相同的布局,如果在每一個頁面都寫上相同的代碼,那個維護的工作量就太大了。為了減少不必要的重復工作,Django允許開發者定義基本的模板,然後其他的頁面繼承這個模板的布局。


例如:首先我創建一個模板文件 layout.html

技術分享


layout.html,註意在這個模板裏面,我使用了一個新的模板語言{% block name%}, name可以自己取,這樣凡是繼承這個模板的頁面,在新的頁面裏面,只需要把自己的內容放在同名的{%block name%}裏面,這部分內容就自動替換到模板裏面了,模板的其他部分會全部繼承。


值得一提的是{% block css %}和{% block js %}這兩個block的位置,這是為了新的頁面可以放入自己的css定義和javascript文件,而不是全盤的繼承。


<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>{% block title %} {% endblock %}</title>
    <link rel="stylesheet" href="/static/commons.css" />
    <style>
        body{
            margin: 0;
        }
        .menu{
            display: block;
            padding: 5px;
        }
    </style>
    {% block css %}{% endblock %}
</head>
<body>
    <div style="height: 48px;background-color: black;color: white">
        運維管理系統
    </div>
    <div>
        <div style="position: absolute;top:48px;bottom: 0;left: 0;width: 200px;background-color: brown;">
            <a class="menu" href="/cmdb/user_info/">用戶管理</a>
            <a class="menu" href="/cmdb/user_group/">用戶組管理</a>
        </div>
        <div style="position:absolute;top:48px;left: 210px;bottom: 0;right: 0;overflow: auto">
            {% block content %}
            {% endblock %}
        </div>
    </div>
<script></script>
{% block js %}{% endblock %}
</body>
</html>


下面是一個標準的Django生命周期


urls.py 裏面定義url,指向一個函數


urlpatterns = [
    url(r‘^tpl1/‘, views.tpl1),
]



views.py調用的函數,返回一個列表給tp1.html

def tpl1(request):
    user_list = [1, 2, 3, 43]
    return render(request, ‘tpl1.html‘, {‘u‘: user_list})


tpl1.html 需要繼承前面創建的模板, 通過{% extends ‘layout.html‘ %}指定繼承哪一個模板,通過不同的block的名字可以定義自己的內容,這些內容會自動替換掉layout.html所對應的block,順序並沒關系。可以看見,我的tp1l.html寫的很簡單,全部都是對應模塊和實際內容的替換,這裏沒有任何關於頁面布局的設定,這些都可以從layout.html那裏繼承的。


註意這裏還自定義了這個頁面本身特有的css和Javascript,為了使用它們,前面layout裏面專門定義了css和js的block。


{%  extends ‘layout.html‘ %}
{% block title %}用戶管理{% endblock %}
{% block content %}
    <h1>用戶管理</h1>
    <ul>
        {% for i in u %}
            <li>{{ i }}</li>
        {% endfor %}
    </ul>
{##}
{#    {% for i in u %}#}
{#        {% include ‘tag.html‘ %}#}
{#    {% endfor %}#}
{% endblock %}
{% block css %}
    <style>
        body{
            background-color: whitesmoke;
        }
    </style>
{% endblock %}
{% block js %}
    <script>
        console.log(‘hhh‘)
    </script>
{% endblock %}


效果:成功的繼承了layout的內容,自己定義的內容,css和Javascript也應用了

技術分享

本文出自 “麻婆豆腐” 博客,請務必保留此出處http://beanxyz.blog.51cto.com/5570417/1954342

Django 模板繼承