Django之模板&靜態(tài)文件(一)

  • 補充: html鏈接的相對路徑與絕對路徑
  1. 絕對路徑
    完整的一個路徑就是絕對路徑,即包含schema://host[:port#]/path/.../[?query-string][#anchor]
    例:http://news.sina.com.cn/world/
    2.相對路徑
    第一個字符為斜杠/
    例:“/hello”, 這種會自動幫你添加你的協(xié)議名+域名+端口, 假設(shè)你的前一節(jié)為http://www.baidu.com:8000简逮, 系統(tǒng)會自動匹配為"http://www.baidu.com:8000/hello" (我們實際情況中一般使用這種)
    第一個字符不帶斜杠
    例:“hello”, 這種會在當前url中path段往后添加,假設(shè)你當前路徑http://www.baidu.com:8000/hello, 系統(tǒng)會自動匹配為“http://www.baidu.com:8000/hello/hello, ”
  • settings中模板路徑配置

    settings.py中配置
    image.png
  • 使用構(gòu)建html網(wǎng)頁

#主urls.py
url(r'^test/',include('TestApp.urls'))
#應(yīng)用urls.py
 url(r'^visit/$',views.Visit.as_view())
#views.py
class Visit(View):
    def get(self,request):
        return HttpResponse('<h1>使用直接將html字符串硬編碼到HttpResponse中环揽。</h1>')
image.png
  • 使用render進行渲染
#應(yīng)用urls.py
url(r'^visit/$',views.Visit.as_view())
#views.py中用render關(guān)聯(lián)html文件
from django.shortcuts import render,redirect
class Visit(View):
    def get(self,request):
        #這個路徑是一個相對路徑仔役,類似url路徑規(guī)則胁赢,但是它是從你配置TEMPLATES文件夾開始的,
        #這里配置的是根目錄下的template文件夾亦渗,這里的相對路徑第一個字符挖诸,不需要添加/
        return render(request,'render.html')
#在templates下建立一個html文件render.html
.....
image.png
  • 使用django.template.loader下的get_template方法進行渲染茅糜。(進階用法形庭,了解即可)
#views.py
from django.template.loader import get_template
class Visit(View):
    def get(self,request):
        t = get_template('testTemplate/get_template.html')
        return HttpResponse(t.render())
#templates/testTemplate下新建html文件
  • 模板引擎
  1. Django自帶了一個模板系統(tǒng)柿祈,叫做DTL(Django Template Language)皿渗。
  2. 一個比較流行的模板系統(tǒng),叫做Jinja2
  3. 配置:可以在settings文件中的TEMPLATES->BACKEND進行配置帝嗡,默認使用的是django自帶的DTL绸栅。配置DTL:'BACKEND': django.template.backends.django.DjangoTemplates',配置Jinja2:django.template.backends.jinja2.Jinja2
    image.png
  • 模板變量
    image.png
    image.png

    在模版中使用:語法:{{變量名}}
    1)命名由字母和數(shù)字以及下劃線組成螺男,不能有空格和標點符號洛勉。
    2)不要和python或django關(guān)鍵字重名。原因:如果data是一個字典如迟,那么訪問data.items將會訪問data這個字典的key名為items的值收毫,而不會訪問字典的items方法。

  • 模板標簽
    標簽語法:{% 標簽名稱 %}{% 結(jié)束標簽名稱 %}
    例: {%tag%}{%endtag%}
    if/elif/else:可以使用and/or/in/not/==/!=/<=/>=殷勘,來進行判斷此再。ifequal/ifnotequal
#views.py
class Visit(View):
    def get(self,request):
        li = []
        for i in range(1,10):
            li.append(i)
        #如果不想指定鍵值,可以使用locals(),locals()指獲取當前能獲取到的變量玲销,形成一個字典
        return render(request,'template_tag.html',locals())
#template_tag.html
<body>
{% for i in li %}
    &nbsp;&nbsp;
    {% if i <= 5 %}
        惺淠础:{{i}}
    {% else %}
        大:{{i}}
    {% endif %}
    {% if i == 5 %}
        <br/>
    {% endif %}
{% endfor %}
</body>
image.png

有時候可能在頁面上要用上循環(huán)幾次,可以用

{% for item in  'x'|ljust:'4' %}  循環(huán)四次
{%endfor %}
Django中{% ifequal A B %} 用來比較A和B兩個值是否相等贤斜,{% ifnotequal A B %}` 用來比較A和B兩個值是否不相等策吠。
如:
{% ifequal price 0 %}
    <span class="publicimg"><img src="/images/public.png"></span>
{% else %}
    <span class="publicimg"><img src="/images/vip.png"></span>
{% endifequal %}
其中合法參數(shù)A,B只能是模板變量瘩绒,字符串猴抹,整數(shù)和小數(shù)。 
其他任何類型锁荔,例如Python的字典類型蟀给、列表類型、布爾類型阳堕,都不能作為合法參數(shù)用在 {% ifequal A B %} 中跋理。
#forloop.counter:當前迭代的次數(shù),下標從1開始恬总。
#forloop.counter0:當前迭代的次數(shù)前普,下標從0開始。
#forloop.first:返回bool類型越驻,如果是第一次迭代汁政,返回true,否則返回false道偷。
#forloop.last:返回bool類型,如果是最后一次迭代记劈,返回True勺鸦,否則返回False。
<body>
{% for i in li %}
    &nbsp;&nbsp;
    {% if i <= 5 %}
        心磕尽:{{i}}
    {% else %}
        大:{{i}}
    {% endif %}
    {% if i == 5 %}
        <br/>
        當前迭代次數(shù)换途,下標從1開始:{{forloop.counter}}
        當前迭代次數(shù),下標從0開始:{{forloop.counter0}}
        <br/>
    {% endif %}
    {% if forloop.first %}
        (這是第一次迭代)
    {% elif forloop.last %}
        (這是最后一次迭代)
    {% endif %}
{% endfor %}
</body>
image.png
  • 關(guān)于for ...empty...標簽
<ul>
{% if athlete_list %}
{%手or刽射、 athlete in athlete_list %}
<li>{{ athlete. name } }</li>
{% endfo「%}
{% else %}
<li>S o 「 ry, no athletes in this list.</li>
{% endif %}
</ul>

用 if來判斷某個變量是否為空军拟,如果不為空,就循環(huán)誓禁。因為這種判斷在模板中經(jīng)常會遇到 懈息,
所以 用ango 提供了 一種名為 for... empty 的標簽,它的使用方法是 :

<u l>
{% fo「 ath lete i n athlete_list %}
<li>{{ athlete . name }}</li>
{% empty %}
<li> So「「y, no athletes in t his list.</li>
{% endfor %}
</ul>

  • 過濾器
    1)作用:對變量進行過濾摹恰。在真正渲染出來之前辫继,過濾器會根據(jù)功能處理好變量,然后得出結(jié)果后再替換掉原來的變量展示出來俗慈。
    2)語法:{{greeting|lower}}姑宽,變量和過濾器中間使用管道符號”|”進行使用。
    3)可以通過管道符號進行鏈式調(diào)用闺阱,比如實現(xiàn)一個功能炮车,先把所有字符變成小寫,把第一個字符轉(zhuǎn)換成大寫酣溃,如{{message|lower|capfirst}}
  • 過濾器可以使用參數(shù)瘦穆,在過濾器名稱后面使用冒號”:”再加上參數(shù),比如要把一個字符串中所有的空格去掉救拉,則可以使用cut過濾器难审,代碼如下{{message|cut:" "}},冒號和參數(shù)之間不能有任何空格亿絮,一定要緊挨著告喊。
  • R和time過濾器格式
    獲取當前時間
import datetime
nowTime = datetime.datetime.now()
#頁面獲取:
{{ nowTime|date:"Y-m-d H:i:s" }}
#views.py
# -*- coding: utf-8 -*-
from django.views import View
from django.http import HttpResponse
from django.core.urlresolvers import reverse
from django.shortcuts import render,redirect
import datetime

class Visit(View):
    def get(self,request):
        #獲取當前時間
        nowTime = datetime.datetime.now()
        message = '--Learn Python Language--'
        #如果不想指定鍵值派昧,可以使用locals(),locals()指獲取當前能獲取到的變量黔姜,形成一個字典
        print(locals())
        return render(request,'template_tag.html',locals())
#html文件
<body>
{{ message }}<br/>
upper過濾器大寫:{{ message|upper }}<br/>
lower小寫:{{ message|lower }}<br/>
cut去除‘--’:{{ message|cut:'--' }}<br/>
{{ nowTime }}<br/>
date過濾器:{{ nowTime|date:"Y-m-d H:i:s" }}<br/>
</body>
image.png

django常用過濾器

add:字符串相加,數(shù)字相加蒂萎,列表相加秆吵,如果失敗,將會返回一個空字符串五慈。
default:提供一個默認值纳寂,在這個值被django認為是False的時候使用主穗。比如:空字符串、None毙芜。區(qū)別于default_if_none忽媒,這個只有在變量為None的時候才使用默認值。
first:返回列表中的第一個值腋粥。
last:返回列表中的最后一個值晦雨。
date:格式化日期和時間。
time:格式化時間隘冲。
join:跟python中的join一樣的用法闹瞧。
length:返回字符串或者是數(shù)組的長度。
length_is:字符串或者是數(shù)組的長度是否是指定的值展辞。
lower:把所有字符串都編程小寫奥邮。
truncatechars:根據(jù)后面給的參數(shù),截斷字符罗珍,如果超過了用…表示漠烧。
truncatewords:同truncatechars,這個是以一個單詞為單位進行截斷靡砌。以上兩個有xxx_html類型的,針對html珊楼,截斷標簽中的字符通殃,而不會截斷標簽。
capfirst:首字母大寫厕宗。
slice:切割列表画舌。用法跟python中的切片操作是一樣的,區(qū)間是前閉合后開放已慢。
striptags:去掉所有的html標簽曲聂。
safe:關(guān)閉變量的自動轉(zhuǎn)義
floatformat:浮點數(shù)格式化。
更多可以查詢官方文檔: https://yiyibooks.cn/xx/Django_1.11.6/ref/templates/builtins.html
英文:https://docs.djangoproject.com/en/1.11/ref/templates/builtins/
date時間過濾器格式
Y:四位數(shù)的年佑惠。如:1999
y:兩位數(shù)的年朋腋。如:99
m:兩位數(shù)的月。如:01膜楷,09
n:一位數(shù)的月旭咽。如:1,9赌厅,12
d:兩位數(shù)的日穷绵。如:01,09,31
j:一位數(shù)的日。如:1,9,31
g:12小時制的一位數(shù)的小時特愿。如:1仲墨,9勾缭,12
G:24小時制的一位數(shù)小時。如:0目养,8俩由,23
h:12小時制的兩位數(shù)的小時。如:01混稽,09采驻,12
H:24小時制的兩位數(shù)的小時。如:01,13,24
i:分鐘匈勋。從00-59
s:秒礼旅。從00-59

  • 模板繼承
    1)模板繼承使用extends標簽實現(xiàn)。通過使用block來給子模板開放接口洽洁。
    2)extends必須是模板中的第一個出現(xiàn)的標簽痘系。
    3)子模板中的所有內(nèi)容,必須出現(xiàn)在父模板定義好的block中饿自,否則django將不會渲染汰翠。
    4)如果出現(xiàn)重復(fù)代碼,就應(yīng)該考慮使用模板昭雌。盡可能多的定義block复唤,方便子模板實現(xiàn)更細的需求。
    模板繼承允許你建立一個基本的”骨架”模板, 它包含你所有最常用的站點元素 并 定義了一些可以被子模板覆蓋的block烛卧。
    我們稱它為 base.html, 定義了一些簡單的 HTML 骨架文檔, 你可以把它用到一些簡單兩列的網(wǎng)頁上. “子” 模板的任務(wù)就是用內(nèi)容填寫這些空白的內(nèi)容塊.
    block由子模板引用同名block塊佛纫,來決定是否替換這些部分。block一般定義在base.html中 block是可以在那些繼承base的html中添加內(nèi)容的區(qū)总放。
    子模板決定替換的block塊呈宇,無須關(guān)注其它部分,沒有定義的塊即不替換局雄,直接使用父模板的block塊

base.html

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
    {% block js %}
    {% endblock js %}
</head>
<body>
{% block content %}
{% endblock content %}
</body>
</html>

login.html

{% extends "base.html" %}
{% block content %}
        這是一個登錄頁面
{% endblock %}

include另一個模板

{% include "menu.html" %}
  • 注釋標簽
  1. {#被注釋的內(nèi)容#}:將中間的內(nèi)容注釋掉甥啄。只能單行注釋。
  2. {% comment %}被注釋的內(nèi)容{% endcomment %}:可以多行注釋炬搭。
#基礎(chǔ)模板
{% block title %}一些內(nèi)容蜈漓,這里可不填{% endblock %}
{% block content %}一些內(nèi)容,這里可不填{% endblock %}
{% block footer %}一些內(nèi)容尚蝌,這里可不填{% endblock %}
#子模板的引用方式
{% extends "base.html" %}
{% block title %}The current time{% endblock %}
{% block content %}<p>It is now {{ current_date }}.</p>{% endblock %}

extends 迎变,必須為模板中的第一個模板標記 !

學(xué)以致用
  • 使用render方法,渲染一個頁面
  • 頁面中需要使用模版標簽, 標簽包括(if , else, for)
  • 頁面使用過濾器飘言,包含upper, lower, date, cut
  • 寫一個登錄頁面衣形,它繼承一個模版
  • 繼承的模版需要include一個菜單欄頁面
#base.html
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>{% block title%}基本模板{% endblock %}</title>
    <style>
        *{
            margin: 0;
            padding: 0;
        }
        #topDiv,#bottomDiv{
            background: black;
            height: 40px;
            width: 100%;
            color: white;
            text-align: center;
            line-height: 40px;
        }
        #bottomDiv{
            height: 90px;
            line-height: 90px;
            position: absolute;
            bottom: 0;
        }
        {% block css%}
        {% endblock %}
    </style>
</head>
<body>
<div id="topDiv">
    top頂部信息
</div>
<div id="bottomDiv">
    bottom底部資料
</div>
{% block content %}
{% endblock %}
</body>
</html>
-------------------------------------------------------
#menu.html
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>菜單欄</title>
    <style>
        #menu{
            width: 100%;
            height: 60px;
            color: #666;
        }
        #menu ul li{
            list-style: none;
            float: left;
            margin: 20px;
        }
    </style>
    <script src="jquery.js"></script>
</head>
<body>
    <div id="menu">
        <ul>
            <li>首頁</li>
            <li>編程語言</li>
            <li>項目實戰(zhàn)</li>
            <li>每日一學(xué)</li>
        </ul>
    </div>
</body>
</html>
----------------------------------------
#login.html
    {% extends 'base.html' %}
    {% block title %}login登錄頁面{% endblock %}
    {% block css %}
        #loginbox{
            width: 400px;
            height: 200px;
            border: 1px solid red;
            margin: 90px auto;
            text-align: center;
        }
    {% endblock %}
{% block content%}
    {% include 'menu.html' %}
<div id="loginbox">
    <br/>
    <h2>登錄界面</h2>
    <br/>
    <form>
        帳&nbsp;號:<input type="text">
        <br/>
        <br/>
        密&nbsp;碼:<input type="password">
        <br/>
        <br/>
        <input type="submit" value="登錄">
        &nbsp;&nbsp;&nbsp;&nbsp;
        <input type="button" value="注冊">
    </form>
</div>
{% endblock content%}
#注意:如果是子頁面,你的incude必須寫在block內(nèi),因為子頁面是獲取不到block以為的內(nèi)容谆吴,反正include可任意
在block以外寫任何東西倒源,前端都獲取不到的,會被Django拋棄掉句狼;

效果如下:
image.png
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末笋熬,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子腻菇,更是在濱河造成了極大的恐慌胳螟,老刑警劉巖,帶你破解...
    沈念sama閱讀 212,029評論 6 492
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件筹吐,死亡現(xiàn)場離奇詭異糖耸,居然都是意外死亡,警方通過查閱死者的電腦和手機丘薛,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,395評論 3 385
  • 文/潘曉璐 我一進店門嘉竟,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人洋侨,你說我怎么就攤上這事舍扰。” “怎么了希坚?”我有些...
    開封第一講書人閱讀 157,570評論 0 348
  • 文/不壞的土叔 我叫張陵边苹,是天一觀的道長。 經(jīng)常有香客問我裁僧,道長勾给,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 56,535評論 1 284
  • 正文 為了忘掉前任锅知,我火速辦了婚禮,結(jié)果婚禮上脓钾,老公的妹妹穿的比我還像新娘售睹。我一直安慰自己,他們只是感情好可训,可當我...
    茶點故事閱讀 65,650評論 6 386
  • 文/花漫 我一把揭開白布昌妹。 她就那樣靜靜地躺著,像睡著了一般握截。 火紅的嫁衣襯著肌膚如雪飞崖。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 49,850評論 1 290
  • 那天谨胞,我揣著相機與錄音固歪,去河邊找鬼。 笑死,一個胖子當著我的面吹牛牢裳,可吹牛的內(nèi)容都是我干的逢防。 我是一名探鬼主播,決...
    沈念sama閱讀 39,006評論 3 408
  • 文/蒼蘭香墨 我猛地睜開眼蒲讯,長吁一口氣:“原來是場噩夢啊……” “哼忘朝!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起判帮,我...
    開封第一講書人閱讀 37,747評論 0 268
  • 序言:老撾萬榮一對情侶失蹤局嘁,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后晦墙,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體悦昵,經(jīng)...
    沈念sama閱讀 44,207評論 1 303
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 36,536評論 2 327
  • 正文 我和宋清朗相戀三年偎痛,在試婚紗的時候發(fā)現(xiàn)自己被綠了旱捧。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 38,683評論 1 341
  • 序言:一個原本活蹦亂跳的男人離奇死亡枚赡,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出谓谦,到底是詐尸還是另有隱情,我是刑警寧澤反粥,帶...
    沈念sama閱讀 34,342評論 4 330
  • 正文 年R本政府宣布卢肃,位于F島的核電站,受9級特大地震影響才顿,放射性物質(zhì)發(fā)生泄漏莫湘。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 39,964評論 3 315
  • 文/蒙蒙 一郑气、第九天 我趴在偏房一處隱蔽的房頂上張望幅垮。 院中可真熱鬧,春花似錦尾组、人聲如沸忙芒。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,772評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽呵萨。三九已至,卻和暖如春跨跨,著一層夾襖步出監(jiān)牢的瞬間潮峦,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 32,004評論 1 266
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留跑杭,地道東北人铆帽。 一個月前我還...
    沈念sama閱讀 46,401評論 2 360
  • 正文 我出身青樓,卻偏偏與公主長得像德谅,于是被迫代替她去往敵國和親爹橱。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 43,566評論 2 349

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