DTL:django模板語言
核心:
變量 {{ }}
標籤 {% %}css
-變量渲染:{{變量}}
-變量深度查詢:{{變量.索引/key值/方法}}html
<h2>當前時間戳</h2>
@@time@@
{{ ctime }}
<h1>變量</h1>
<p>{{ age }}</p>
<p>{{ name }}</p>
<p>{{ dic }}</p>
<p>{{ li }}</p>
<h2>取出字典的名字</h2>
<p>{{ dic.name }}</p>
<h2>取出列表中的某個值</h2>
<p>{{ li.0 }}</p>
<h2>變量之對象</h2>
<p>{{ lqz }}</p>
<p>{{ lqz.test1 }}</p>
<h2>類調用方法不行,智能用對象</h2>
<p>{{ Test.test2 }}</p>
<p>{{ lqz.test2 }}</p>
def test(request): # 顯示時間戳 # with open('templates/test01.html','r') as f: # data=f.read() # data=data.replace('@@time@@',str(time.time())) # return HttpResponse(data) # ctime=str(time.time()) # return render(request, 'test01.html', {'ctime': ctime}) # 變量 age=17 name='dhhfg' dic={'name':'紅樓','pub_date':'2018-12-30','price':888} li=['dgfgf',18] li2=[] # locals()把全部局部變量傳到模板中 class Test(): def __init__(self, name, pwd): self.name = name self.pwd = pwd def test1(self): return self.name def __str__(self): return self.pwd @classmethod def test2(cls): return 'clsss' lqz = Test('lqz', '123') # print(lqz) # print(lqz.test1()) file_size=10240000 bol=[] import _datetime today=_datetime.datetime.now() h1='hello world abc' href='<a href="http://www.baidu.com">baidu</a>' from django.utils.safestring import mark_safe href2=mark_safe(href) return render(request,'test01.html',locals())
變量之過濾器(是個函數)
-語法:(後面只能傳一個參數)
{{變量名|過濾器的名字:參數}}
-內置過濾器:
<p>{{ age|add:3 }}</p>
<p>{{ name|length }}</p>
<p>{{ bol|default:'123' }}</p>
<p>{{ ll2|default:'我是空的' }}</p>
<p>{{ file_size|filesizeformat }}</p>
<p>{{ ctime }}</p>
<p>{{ ctime|date:'Y年m月' }}</p>
<p>{{ name|slice:'2:4' }}</p>
<p>{{ name|truncatechars:6 }}</p>
<p>{{ name2|truncatewords:2}}</p>
<p>{{ href|safe }}</p>python
<h1>過濾器</h1>
<p>age+100</p>
<p>{{ age|add:100 }}</p>
<p>name lenght</p>
<p>{{ name|length }}</p>
<p>bol default</p>
<p>{{ bol|default:'123' }}</p>
<h2>filesize </h2>
<p>{{ file_size|filesizeformat }}</p>
<h2>date</h2>
<p>{{ today|date:'Y年m月d日' }}</p>
<h2>slice</h2>
<p>{{ h1|slice:':-1' }}</p>
<p>{{ h1|slice:'0:2' }}</p>
<p>{{ h1|slice:'-5:-1' }}</p>
<h2>truncatehars</h2>
<p>{{ h1|truncatechars:6 }}</p>
<h2>truncatewords</h2>
<p>{{ h1|truncatewords:2 }}</p>
<h2>href</h2>
<p>{{ href|safe }}</p>
#django已經避免xss攻擊,但慎用safe,確認內容是否安全,注意xss攻擊(跨站腳本攻擊),如<script>alert(123)</script>
<p>{{ href2 }}</p>
或者from django.utils.safestring import mark_safe
href2=mark_safe(href)
-語法:{% %}
-foo是一個可迭代對象
{% for a in foo %}web
{% endfor %}
-forloop:counter,couter0,revcounter,revcouter0,first,last,parentloop:父循環的forloop對象
-for--empty的使用
{% for foo in ll2 %}
{{ foo }}
{% empty %}
沒有值啊
{% endfor %}
-if判斷
{% if ll2 %}
ll2 有值
{% elif ll %}
ll有值
{% else %}
ll2 沒有值
{% endif %}
-with重命名
{% with dic.hobby.1 as a %}
{#{% with a=dic.hobby.1 %}#}
{{ a }}
<p>aaaa</p>
{{ a }}django
{% endwith %}flask
<h1>模板之標籤</h1>
<h2>for</h2>
{% for foo in li %}
<p>{{ foo }}</p>
{% endfor %}
<h2>li2------</h2>
{% for foo in li2 %}
<p>{{ foo }}</p>
{% empty %}
<p>no,data</p>
{% endfor %}
<h2>if</h2>
{% if li %}
data
{% elif age > 10 %}
age>10
{% else %}
age<10
{% endif %}
<h2>with</h2>
{#{% with li.1 as a %}#}
{% with a=li.0 %}
{{ a }}
{% endwith %}
1 確認app是否在settings中註冊
2 在app下建立templatetags的模塊(名字固定)
3 在模塊下建立py文件(名字隨意)--->在模板中{% load py文件名字%}
4 在py文件中寫過濾器
from django.template import Library
register = Library()
#指定了name以後,模板上使用的時候,直接用name調用,若是沒指定name,就用函數的名字
# 過濾器最多有兩個參數
@register.filter(name='myadd')
def my_add(a,b):
print(a+b)
return a+b
5 模板中使用
-1 {% load py文件名字%}
-2 {{ 變量|myadd:1}}bootstrap
from django.template import Library
from app01.models import *
register = Library()
#指定了name以後,模板上使用的時候,直接用name調用,若是沒指定name,就用函數的名字
# 過濾器最多有兩個參數
@register.filter(name='myadd')
def my_add(a,b):
print(a+b)
return a+b
{% load my_tag %}
{{ age|myadd:4 }}
{% if age|myadd:4 > 20 %}
大於20
{% endif %}
# -寫一個過濾器:
# -實現過濾敏感詞彙
# 操--->和諧
# 你麻痹--->民主
# -替換的字符,是能夠配置的
def data(request):
if request.method=='GET':
inputall = models.Input.objects.all()
return render(request,'test_sen_input.html',{'content':inputall})
else:
con = request.POST.get('content')
print(con)
ret = Input.objects.create(data=con)
# return HttpResponse('添加成功')
return redirect('/data/')
@register.filter(name='senword')
def sen_word(word):
sen_word=Sen.objects.filter(sen=word)
if sen_word:
return sen_word[0].cha
return word
{% for i in content %}
{% load my_tag %}
<p>{{ i.data|senword }}</p>
{% endfor %}
1 確認app是否在settings中註冊
2 在app下建立templatetags的模塊(名字固定)
3 在模塊下建立py文件(名字隨意)--->在模板中{% load py文件名字%}
4 在py文件中寫過濾器
from django.template import Library
register = Library()
#指定了name以後,模板上使用的時候,直接用name調用,若是沒指定name,就用函數的名字
# 過濾器最多有兩個參數
@register.simple_tag(name='mytag')
def my_tag(a,b,c):
return a+b+c
5 模板中使用
-1 {% load py文件名字%}
-2 {% mytag 參數1 參數2 參數3%}瀏覽器
# 自定義一個標籤
# 標籤能夠傳多個參數
@register.simple_tag(name='mytag')
def my_tag(a,b,c):
return a+b+c
{#標籤不能跟在if判斷後面#}
{#{% if mytag 1 2 3 > 30 %}#}
{# #}
{#{% endif %}#}
{% mytag 1 2 3 %}
1 標籤能夠傳多個參數,過濾器最多隻能傳2個
2 使用過濾器{{ }} 標籤使用:{% %}
3 ****重點:過濾器能夠放在if判斷後,標籤不能放在if判斷後安全
-遵循一個協議wsgi(Web Server Gateway Interface web服務網關接口)服務器
-S包括兩部分:web服務器+application
-目前階段django項目用的web服務器是:wsgiref(併發性很差)+application(django)
-上線會用uwsgi+application
-web服務器(本質是socket)都實現了wsgi協議
-wsgi:web服務網關接口,是一個協議
-如何引入靜態文件(static目錄的配置)
-模板的導入:
1 寫一個好看的模板
2 在想用的地方:
{% include '好看模板的名字.html' %}
-模板的繼承
-寫一個母版,base.html(留一些block(盒子)),留的盒子越多,可擴展性就越高
{% block top %}
{% endblock %}
-使用:
-在一個新的html中
-{%extend 'base.html'%}
-擴寫留的對應的盒子
{% block top %}
擴寫的內容
{% endblock %}
-注意:
1 擴寫的時候,盒子的位置無所謂,只要名字對應正確,就會正確填充
2 盒子能夠不擴寫,不寫就是原來的樣子
3 若是要顯示母版盒子中原來的東西,須要
{{block.super}}----寫在哪,原來的內容就放在哪
1 直接寫死的:<link rel="stylesheet" href="/static/bootstrap-3.3.7-dist/css/bootstrap.css">
2 用static標籤:
{% load static %}
<link rel="stylesheet" href="{% static 'bootstrap-3.3.7-dist/css/bootstrap.css' %}">
3 用get_static_prefix:
{% load static %}
<link rel="stylesheet" href="{% 用get_static_prefix %}bootstrap-3.3.7-dist/css/bootstrap.css">
1 前面幾步跟標籤和過濾器同樣
2 裝飾器:@register.inclusion_tag('inclusiontag.html',name='lqz'),第一個參數是要操做的模板
3 返回一個字典,字典中的值,能夠在inclusiontag中使用
4 使用:
{%load 你寫的那個py文件%}
{% 函數名字 參數 參數 %}
from django.template import Library
from app01.models import *
register=Library()
@register.inclusion_tag('inclusion_tag.html',name='books')
def mytag(num):
books = Book.objects.all()[:int(num)]
return {'books':books}
{% load my_tag %}
{% books num %}
def select(request):
num=0
if request.method=='POST':
num=request.POST.get('input')
return render(request, 'select.html',{'num':num})
1 模板語言之變量:
-{{ }} 至關於執行了print
-深度查詢 . 若是是方法,不能加括號,不能傳參數
2 過濾器
{{ 變量|過濾器的名字:'參數' }}
-add
-default
-safe:(慎重,注意xss攻擊)
-在視圖層處理標籤字符串:href2=mark_safe(href)
-length
-date
...
3 xss攻擊
-跨站腳本攻擊
4 標籤:
-for :
{% for i in 可迭代對象 %}
{{forloop}}
{%empty%}
可迭代對象爲空,會執行這裏
{%endfor%}
-if : > < and in or ...
{%if 條件%}
{%if 條件2}
{%for %}
{%endfor%}
{%endif%}
{%elif 條件%}
{%else%}
{%endif%}
-with:命別名
5 自定義標籤,過濾器
1 app是否註冊
2 templatetags模塊:名字必定不能錯
3 建立py文件(名字隨意)
4 from django.template import Library
5 register=Library()
6 寫過濾器:
@register.filter(name='別名')
def myfilter(a,b):
邏輯處理
return XX
7 寫個標籤:
@register.simple_tag(name='別名')
def myfilter(a,b,c):
邏輯處理
return XX
8 使用過濾器
{%load mytag %}
{{變量|過濾器名:'參數'}}
9 使用標籤
{%load mytag %}
{% 標籤名 參數1 參數2%}
10區別:
1 過濾器最多兩個參數,標籤能夠多個
2 使用的時候,{{過濾器}},{% 標籤%}
3 **** 過濾器能夠放在if判斷中,for循環中
6 模板語言註釋:
{#要註釋的內容#}
-這種註釋,在瀏覽器中是看不到的
-http請求的本質: -socket -web應用 -server + application -測試階段:wsgiref -項目上線:uwsgi a:socket b:路由映射關係 c:模板語言的渲染 django: a:用別人的 b:本身寫的 c:本身寫的 flask: a:別人的 b:本身寫的 c:用了別人的 tornado:a:本身寫的 b:本身寫的 c:本身寫的 -模板導入: -寫了一個很好看組件(模板) {% include '名字'%} -模板的繼承 -寫一個母版,留好的盒子 {%block 名字%} 寫東西 {% endblock%} -{%extends '母版的名字'%} - {%block 名字%} 寫東西 {{block.super}} {% endblock%} -靜態文件相關 -在setting中: -STATICFILES_DIRS=[文件夾的路徑,] -在模板中使用: 1 路徑寫死 2 動態的生成全路徑: {% load static %} {%static '靜態文件路徑'%} 3 只獲取static的路徑 {% load static %} {% get_static_prefix %} -inclusion_tag -反回一個html片斷