1. 程式人生 > 實用技巧 >Django之模板層

Django之模板層

模版語法傳值

{{}}:變數相關

{%%}:邏輯相關

def index(request):
    # 模版語法可以傳遞的後端python資料型別
    n = 123
    f = 11.11
    s = '我也想奔現'
    b = True
    l = ['小紅','姍姍','花花','茹茹']
    t = (111,222,333,444)
    d = {'username':'jason','age':18,'info':'這個人有點意思'}
    se = {'晶晶','洋洋','嚶嚶'}
 
    def func():
        print(
'我被執行了') return '你的另一半在等你' class MyClass(object): def get_self(self): return 'self' @staticmethod def get_func(): return 'func' @classmethod def get_class(cls): return 'cls' # 物件被展示到html頁面上 就類似於執行了列印操作也會觸發__str__方法 def __str__(self):
return '到底會不會?' obj = MyClass() # return render(request,'index.html',{}) # 一個個傳 return render(request,'index.html',locals()) <p>{{ n }}</p> <p>{{ f }}</p> <p>{{ s }}</p> <p>{{ b }}</p> <p>{{ l }}</p> <p>{{ d }}</p> <p>{{ t }}</p> <p>{{ se }}</p> <p>傳遞函式名會自動加括號呼叫 但是模版語法不支援給函式傳額外的引數:{{ func }}</p> <p>傳類名的時候也會自動加括號呼叫(例項化){{ MyClass }}</p> <p>內部能夠自動判斷出當前的變數名是否可以加括號呼叫 如果可以就會自動執行 針對的是函式名和類名</p> <p>{{ obj }}</p> <p>{{ obj.get_self }}</p> <p>{{ obj.get_func }}</p> <p>{{ obj.get_class }}</p> # django模版語法的取值 是固定的格式 只能採用“句點符” .
<p>{{ d.username }}</p> <p>{{ l.0 }}</p> <p>{{ d.hobby.3.info }}</p> # 即可以點鍵也可以點索引 還可以兩者混用

過濾器(過濾器只能最多有兩個引數)

# 過濾器就類似於是模版語法內建的 內建方法
# django內建有60多個過濾器 我們不需要學這麼多 瞭解10個左右就差不多了 後面碰到了再去記憶
 
 
 
# 基本語法
{{資料|過濾器:引數}}或
{{obj|filter__name:param}}  變數名字|過濾器名稱:變數
# 轉義 # 前端 |safe # 後端 from django.utils.safestring import mark_safe res = mark_safe('<h1>新新</h1>') """ 以後你在全棧專案的時候 前端程式碼不一定非要在前端頁面書寫 也可以現在先在後端寫好 然後傳遞給前端頁面 """  <h1>過濾器</h1> <p>統計長度:{{ s|length }}</p> <p>預設值(第一個引數布林值是True就展示第一個引數的值否在展示冒號後面的值):{{ b|default:'啥也不是' }}</p> <p>檔案大小:{{ file_size|filesizeformat }}</p> <p>日期格式化:{{ current_time|date:'Y-m-d H:i:s' }}</p> <p>切片操作(支援步長):{{ l|slice:'0:4:2' }}</p> <p>切取字元(包含三個點):{{ info|truncatechars:9 }}</p> <p>切取單詞(不包含三個點 按照空格切):{{ egl|truncatewords:9 }}</p> <p>切取單詞(不包含三個點 按照空格切):{{ info|truncatewords:9 }}</p> <p>移除特定的字元:{{ msg|cut:' ' }}</p> <p>拼接操作:{{ l|join:'$' }}</p> <p>拼接操作(加法):{{ n|add:10 }}</p> <p>拼接操作(加法):{{ s|add:msg }}</p> <p>轉義:{{ hhh|safe }}</p> <p>轉義:{{ sss|safe }}</p> <p>轉義:{{ res }}</p>

標籤

# for迴圈
    {% for foo in l %}
    <p>{{ forloop }}</p>
    <p>{{ foo }}</p>  一個個元素
    {% endfor %}
  {'parentloop': {}, 'counter0': 0, 'counter': 1, 'revcounter': 6, 'revcounter0': 5, 'first': True, 'last': False}
 
# if判斷
{% if b %}
    <p>baby</p>
{% elif s%}
    <p>都來把</p>
{% else %}
    <p>老baby</p>
{% endif %}
 
 
# for與if混合使用
{% for foo in lll %}
    {% if forloop.first %}
        <p>這是我的第一次</p>
    {% elif forloop.last %}
        <p>這是最後一次啊</p>
    {% else %}
        <p>{{ foo }}</p>
    {% endif %}
    {% empty %}
        <p>for迴圈的可迭代物件內部沒有元素 根本沒法迴圈</p>
{% endfor %}
 
 
 
# 處理字典其他方法
{% for foo in d.keys %}
    <p>{{ foo }}</p>
{% endfor %}
{% for foo in d.values %}
    <p>{{ foo }}</p>
{% endfor %}
{% for foo in d.items %}
    <p>{{ foo }}</p>
{% endfor %}
 
 
# with起別名
{% with d.hobby.3.info as nb  %}
    <p>{{ nb }}</p>
    在with語法內就可以通過as後面的別名快速的使用到前面非常複雜獲取資料的方式
    <p>{{ d.hobby.3.info }}</p>
{% endwith %}

自定義過濾器、標籤、inclusion_tag

"""
先三步走
    1.在應用下建立一個名字”必須“叫templatetags資料夾
    2.在該資料夾內建立“任意”名稱的py檔案 eg:mytag.py
    3.在該py檔案內"必須"先書寫下面兩句話(單詞一個都不能錯)
        from django import template
        
        register = template.Library()
"""
 
# 自定義過濾器
@register.filter(name='baby')
def my_sum(v1, v2):
    return v1 + v2
# 使用
{% load mytag %}
<p>{{ n|baby:666 }}</p>
 
 
# 自定義標籤(引數可以有多個)            類似於自定義函式
@register.simple_tag(name='plus')
def index(a,b,c,d):
    return '%s-%s-%s-%s'%(a,b,c,d)
# 使用
標籤多個引數彼此之間空格隔開
<p>{% plus 'jason' 123 123 123 %}</p>
 
 
# 自定義inclusion_tag
"""
內部原理
    先定義一個方法 
    在頁面上呼叫該方法 並且可以傳值
    該方法會生成一些資料然後傳遞給一個html頁面
    之後將渲染好的結果放到呼叫的位置
"""
@register.inclusion_tag('left_menu.html')
def left(n):
    data = ['第{}項'.format(i) for i in range(n)]
    # 第一種
    # return {'data':data}  # 將data傳遞給left_menu.html
    # 第二種
    return locals()  # 將data傳遞給left_menu.html
  
{% left 5 %}
# 總結:當html頁面某一個地方的頁面需要傳引數才能夠動態的渲染出來,並且在多個頁面上都需要使用到該區域性 那麼就考慮將該區域性頁面做成inclusion_tag形式
(在講bbs的時候會使用到)

模版的繼承

"""
你們有沒有見過一些網站
    這些網站頁面整體都大差不差 只是某一些區域性在做變化    
"""
# 模版的繼承 你自己先選好一個你要想繼承的模版頁面
{% extends 'home.html' %}
 
# 繼承了之後子頁面跟模版頁面長的是一模一樣的 你需要在模版頁面上提前劃定可以被修改的區域
{% block content %}
    模版內容
{% endblock %}
 
# 子頁面就可以宣告想要修改哪塊劃定了的區域
{% block content %}
    子頁面內容    
{% endblock %}
 
 
# 一般情況下模版頁面上應該至少有三塊可以被修改的區域
    1.css區域
  2.html區域
  3.js區域
  {% block css %}
 
    {% endblock %}
  
  {% block content %}
 
    {% endblock %}
  
  {% block js %}
 
    {% endblock %}
  # 每一個子頁面就都可以有自己獨有的css程式碼 html程式碼 js程式碼
  
"""
一般情況下 模版的頁面上劃定的區域越多 那麼該模版的擴充套件性就越高
但是如果太多 那還不如自己直接寫
"""

模版的匯入

"""
將頁面的某一個區域性當成模組的形式
哪個地方需要就可以直接匯入使用即可
"""
{% include 'wasai.html' %}

三種編碼方式傳資料

######1  三種編碼格式
# def home(request):
#     return render(request,'home.html')
# def index(request):
#     # 接收urlencoded編碼
#     # print(request.POST)
#
#     # 接收form-data編碼
#     #資料部分
#     # print(request.POST)
#     # #檔案部分
#     # print(request.FILES)
#
#     # 接收json格式
#     # 這裡沒有
#     print(request.POST)
#     # 資料在這(自行處理)
#     print(request.body)
#
#
#     return HttpResponse('ok')