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 模板繼承