Django 之 模板系統css
Django相關語法,記住以下兩種特殊符號:html
{{變量名}} 變量名由字母數字和下劃線組成python
點 (.)用來獲取對象的相應屬性值django
例子:安全
viewapp
class Person(): def __init__(self, name, age): self.name = name self.age = age def talk(self): return '生活靜好,不存在的' def __str__(self): return "<Person {} - {}>".format(self.name, self.age) def temp(request): string = '微分,微分,你學會了嗎,better,better' age = 12 name_list = ['思域', '圖靈', '清然', '柳眉', '雷巖', '浩瀚'] mei_dict = { 'name': '雷巖', 'hobby': 'dance', 'gender': '女', 'keys': '斯菲斯非,虛無縹緲' } now = datetime.datetime.now() p1 = Person('xinxin', 12) return render(request, 'temp.html', { 'string': string, 'age': age, 'name_list': name_list, 'mei_dict': mei_dict, 'l1': [1, 2, 3, 4], 'l2': [5, 6, 7, 8], 'p1': p1, 'kong': [], 'num': 'x1', } )
模板中函數
<h1>{{ string}}</h1> {# 取name_list中的第一個值 #} <h1>{{ name_list.0 }}</h1> {# 取字典中key = name的value值 #} <h1>{{ mei_dict.name }}</h1> {# 取字典中的全部key值,若keys也爲key,則取的是keys對應的value值 #} <h1>{{ mei_dict.keys}}</h1> {# 取字典中全部的value值 #} <h1>{{ mei_dict.values }}</h1> {# #} <h1>{{ mei_dict.items }}</h1> {# 取對象name的屬性 #} <h1>{{ p1.name }}</h1> {# 取對象 #} <h1>{{ p1 }}</h1> {# .點操做只能調用不帶參數的方法 #} <h1>{{ p1.talk }}</h1>
注:當模板遇到一個(.)的時候,會按照以下順序去查詢:oop
一、在字典中查詢網站
二、屬性或者方法ui
三、數字索引
過濾器是用來修改變量展現的結果
語法:{{value|filter_name:參數}}
{{value|default:"nothing"}}
若是value沒有傳值的話就顯示nothing
注:TEMPLATES的OPTIONS能夠增長一個選項:string_if_invalid:'找不到',能夠替代default的做用
將值轉化爲一我的類可讀的文件尺寸,最大到PB
{{filesize|filesizeformat}}
給變量加參數,若都爲字符串則鏈接
{{value|add:'2'}}
{#如果列表,則把兩個列表合爲一個列表#} {{l1|add:'l2'}}
若是字符串多餘指定的字符數量,那麼會被截斷。截斷的字符串將以可翻譯的省略號序列(「...」)結尾。
參數:截斷的字符數
{{value|truncatechars:8}}
日期格式化
{{value|date:'Y-m-d H:i:s'}}
也可在settings中固定日期的格式
# settings 中配置 USE_L10N = False DATETIME_FORMAT = 'Y-m-d H:i:s'
Django中的模板爲了安全,會對HTML和JS等語法標籤進行自動轉義,可是有的時候,咱們並不但願這些內容被轉義,這個時候就能夠經過過濾器|safe的方式告訴django這段代碼是安全的沒必要轉義
{{value|safe}}
官網
https://docs.djangoproject.com/en/1.11/ref/templates/builtins/#built-in-filter-reference
一、在app下建立一個名爲templatetags的python包 ,文件名是固定的,不能改
二、在包內建立py文件 ---my_tags.py
三、在py文件中寫入:
from django import template
register = template.Library() # register 是固定的
四、寫函數加裝飾器
@register.filter def add_str(value, arg=None): # 函數名就是過濾器的名字,value變量 arg給變量添加額外的參數 ret = '{}__{}'.format(value,arg) return ret
五、使用
{%load my_tags%} # 導入文件 {{'zhouyou'|add_str:'zhengxing'}}
<ul> {% for book in book_list%} <li>{{book.name}}</li> {%endfor%} </ul>
forloop.counter 當前循環的索引值(從1開始)
forloop.counter0 當前循環的索引值(從0開始)
forloop.revcounter 當前循環的倒敘索引值(從1開始)
forloop.revcounter0 當前循環的倒敘索引值(從0開始)
forloop.first 當前循環是否是第一次循環(布爾值)
forloop.last 當前循環是否是最後一次循環(布爾值)
forloop.parentloop 本層循環的外層循環
<ul> {% for book in book_list%} <li>{{book.name}}</li> {% empty %} <span>空的</span> {%endfor%} </ul>
{% if book_list%} 書籍數:{{book_list|length}} {% elif book_em%} 情感類:{{book_em|length}} {% else %} 沒有書籍 {% end if%}
注:
一、條件不支持 5 > 3 >2 的連續判斷 False
二、支持爲and,or, == , >,<,>= ,<=,is,is not,in, not in
三、不支持算術運算
爲避免文件路徑變化而找不到靜態文件,用別名
首先配置settings
STATIC_URL = '/static/' STATICFILES_DIRS = [ os.path.join(BASE_DIR,'static') ]
使用
{% load static%} {% static '靜態文件路徑'%} # 完整的靜態文件路徑 {% get_static_prefix%} #靜態文件的別名
{% load static%} <img src="{% get_static_prefix%}images/hi.jpg" alt="Hi!"/>
或者
{% load static %} {% get_static_prefix as STATIC_PREFIX %} <img src="{{ STATIC_PREFIX}}images/hi.jpg" alt="Hi!" /> <img src="{{STATIC_PREFIX}}IMAGES.hi2.jpg" alt="Hello!" />
母版:
就是普通的HTML,提取了多個頁面的公共部分
定義一些block塊,讓子頁面從新覆蓋 {% block 名字%} {% endblock %}
在母板中寫block塊
{% block content%} {% endblock%} {% block js%}{%endblock%} {% block css%}{%endblock%}
在子板中繼承
{% extends '母板的名稱'%} {% block content %} 重寫block塊 {% endblock%}
注意:
一、{% extends '母版的名稱'%} 寫在第一行,前面不能有內容
二、{% extends ’母版的名稱‘%} 模板的文件名引號要帶上,否則會看成變量查找
三、要顯示的內容放在block塊中,其餘部分不顯示
四、模板中定義多個block塊,通常寫上css,js
csrf(Cross-site request forgery)
跨站請求僞造:對網站的惡意利用
將經常使用的頁面北榮如導航條,頁尾信息等組件保存在單獨的文件中,而後在須要使用的地方導入
{% include 'navbar.html'%}
和自定義filter相似,只不過接收更靈活的參數。
定義註冊simple_tag
@register.simple+tag(name="plus) def plus(a,b,c): return "{} + {} + {}".format(a,b,c)
使用自定義simple_tag
{% load app01_demo%} {% plus "1" "2" "abc" %}
多用於返回HTML代碼段
步驟:
一、在app下建一個templatetags的python文件包(文件名固定)
二、在templatetags下創建一個py文件, (my_tags)
三、my_tags.py
from django import template register = template.Library() @register.inclusion_tag('模板的文件名稱(result.html)') def show_results(n): num=1 if num<1 else int(num) data = ["第{}頁".format(i) for i in range(1,n+1)] return {"data":data}
四、result.html
<ul> {% for choice in data %} <li>{{ choice }}</li> {% endfor %} </ul>
五、使用
{% load my_inclusion %} {% show_results 10 %}