Django 之 模板系統

Django  之  模板系統css

  一、語法

Django相關語法,記住以下兩種特殊符號:html

1.一、{{ }} 變量相關,在模板渲染的時候替換成值
1.2 {% %} 邏輯相關的操做

  二、變量

{{變量名}} 變量名由字母數字和下劃線組成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

三、數字索引

 

  三、Filters(過濾器)

過濾器是用來修改變量展現的結果

語法:{{value|filter_name:參數}}

default
{{value|default:"nothing"}}

 

若是value沒有傳值的話就顯示nothing

注:TEMPLATES的OPTIONS能夠增長一個選項:string_if_invalid:'找不到',能夠替代default的做用

filesizeformat

將值轉化爲一我的類可讀的文件尺寸,最大到PB

{{filesize|filesizeformat}} 
add

給變量加參數,若都爲字符串則鏈接

{{value|add:'2'}}
{#如果列表,則把兩個列表合爲一個列表#}
{{l1|add:'l2'}}

  

truncatechars

若是字符串多餘指定的字符數量,那麼會被截斷。截斷的字符串將以可翻譯的省略號序列(「...」)結尾。

參數:截斷的字符數

{{value|truncatechars:8}}  
date

日期格式化

{{value|date:'Y-m-d H:i:s'}}

 也可在settings中固定日期的格式

 

# settings 中配置 
USE_L10N = False
DATETIME_FORMAT = 'Y-m-d H:i:s'
safe

Django中的模板爲了安全,會對HTML和JS等語法標籤進行自動轉義,可是有的時候,咱們並不但願這些內容被轉義,這個時候就能夠經過過濾器|safe的方式告訴django這段代碼是安全的沒必要轉義

{{value|safe}}

官網

https://docs.djangoproject.com/en/1.11/ref/templates/builtins/#built-in-filter-reference

 

  自定義filter

步驟:

一、在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'}}

  標籤tags

for
<ul> {% for book in book_list%} <li>{{book.name}}</li> {%endfor%} </ul>
for 循環可用的一些參數:

forloop.counter 當前循環的索引值(從1開始)

forloop.counter0 當前循環的索引值(從0開始)

forloop.revcounter 當前循環的倒敘索引值(從1開始)

forloop.revcounter0 當前循環的倒敘索引值(從0開始)

forloop.first 當前循環是否是第一次循環(布爾值)

forloop.last 當前循環是否是最後一次循環(布爾值)

forloop.parentloop 本層循環的外層循環

empty  
<ul> {% for book in book_list%} <li>{{book.name}}</li> {% empty %} <span>空的</span> {%endfor%} </ul>
if elif else
{% 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

三、不支持算術運算

 

  靜態文件 static

爲避免文件路徑變化而找不到靜態文件,用別名

 

首先配置settings

STATIC_URL = '/static/' STATICFILES_DIRS = [ os.path.join(BASE_DIR,'static') ]

使用

{% load static%} {% static '靜態文件路徑'%} # 完整的靜態文件路徑 {% get_static_prefix%} #靜態文件的別名

使用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_token

csrf(Cross-site request forgery)

跨站請求僞造:對網站的惡意利用

  組件

將經常使用的頁面北榮如導航條,頁尾信息等組件保存在單獨的文件中,而後在須要使用的地方導入

{% include 'navbar.html'%}

  自定義simpletag

和自定義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" %}

  inclusion_tag

多用於返回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 %}
相關文章
相關標籤/搜索