- 補充: html鏈接的相對路徑與絕對路徑
- 絕對路徑
完整的一個路徑就是絕對路徑,即包含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中配置
使用構(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>')
- 使用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
.....
- 使用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文件
- 模板引擎
- Django自帶了一個模板系統(tǒng)柿祈,叫做DTL(Django Template Language)皿渗。
- 一個比較流行的模板系統(tǒng),叫做Jinja2
-
配置:可以在settings文件中的TEMPLATES->BACKEND進行配置帝嗡,默認使用的是django自帶的DTL绸栅。配置DTL:'BACKEND': django.template.backends.django.DjangoTemplates',配置Jinja2:django.template.backends.jinja2.Jinja2
-
模板變量
在模版中使用:語法:{{變量名}}
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 %}
{% if i <= 5 %}
惺淠础:{{i}}
{% else %}
大:{{i}}
{% endif %}
{% if i == 5 %}
<br/>
{% endif %}
{% endfor %}
</body>
有時候可能在頁面上要用上循環(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 %}
{% 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>
- 關(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>
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" %}
- 注釋標簽
- {#被注釋的內(nèi)容#}:將中間的內(nèi)容注釋掉甥啄。只能單行注釋。
- {% 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>
帳 號:<input type="text">
<br/>
<br/>
密 碼:<input type="password">
<br/>
<br/>
<input type="submit" value="登錄">
<input type="button" value="注冊">
</form>
</div>
{% endblock content%}
#注意:如果是子頁面,你的incude必須寫在block內(nèi),因為子頁面是獲取不到block以為的內(nèi)容谆吴,反正include可任意
在block以外寫任何東西倒源,前端都獲取不到的,會被Django拋棄掉句狼;
效果如下: