1. 程式人生 > 其它 >6.模板層

6.模板層

模板層

模板語法之傳值

# 傳值方式1:利用字典挨個傳值
return render(request,'index.html',{'i':i,'f':f,'s':s})

# 傳值方式2:簡單粗暴  locals()將當前名稱空間中所有的變數名全部傳遞給頁面
return render(request,'index.html',locals())

"""
    傳值方式1  傳值精確 不會造成資源浪費
    傳值方式2  傳值粗糙 可能會造成一定的資源浪費
"""
補充:傳遞函式名和類名都會自動加括號呼叫(模板語法不支援傳參)

模板語法之獲取值

'''django模板語法取值只能採用  句點符(.) '''
索引 鍵都可以無限制的點點點
<p>{{ d.hobby.3.username }}</p>

模板語法之過濾器

# 類似於python的內建方法
<p>過濾器:將豎杆左側的資料當做第一個引數</p>
    
<p>統計長度:{{ s|length }}</p>
<p>加法運算:{{ i|add:100000000000 }}</p>
<p>字串拼接:{{ s|add:'heiheihei' }}</p> # add把add後面的資訊拼接到最後
<p>字串拼接:{{ info|join:'$'}}</p> # join 是以join指定的資訊作為拼接符進行拼接操作
<p>日期格式:{{ current_time|date:'Y年-m月-d日 H時-i分-s秒' }}</p>
<p>預設值:{{ b|default:'哈哈' }}</p>  # 原始碼裡面是value or arg 意思就是如果b=True結果就是True,如果b=False,結果就是|後面給的預設值
<p>檔案大小:{{ file_size|filesizeformat }}</p> # filesizeformat能夠展示檔案大小
<p>切片操作(支援步長):{{ l|slice:'0:4:2' }}</p>
<p>擷取文字(三個點也算):{{ s|truncatechars:6 }}</p>
<p>擷取文字(三個點不算)空格:{{ s|truncatewords:3 }}</p>  # 按照空格切
<p>{{ h|safe }}</p>	# h = <h1>ppp</h>  告訴瀏覽器這個標籤是安全的 讓瀏覽器轉換(不加safe瀏覽器會取消轉義)
<p>{{ sss }}</p>
<p>{{ sss1 }}</p>

轉義
	前端
		|safe
	後端
		from django.utils.safestring import mark_safe
		sss1 = mark_safe('<h2>老子要掙大錢</h2>')
	ps:前端程式碼也可以在後端寫好傳入!!!

模板語法之標籤

"""
{{}}  變數相關
{%%}  邏輯相關
"""

# 類似於python的流程控制
{% for foo in l %}
    <p>{{ foo }}</p>
{% endfor %}

{% if b %}
    <p>baby</p>
{% else %}
    <p>big baby</p>
{% endif %}

# for與if結合使用
{% for foo in l %}
    {% if forloop.first %}
        <p>第一次</p>
    {% elif forloop.last %}
        <p>最後一次</p>
    {% else %}
        <p>{{ foo }}</p>
    {% endif %}
    {% empty %}  # ------>迴圈物件為空的時候
        <p>迴圈的物件為空</p>
{% endfor %}


# 瞭解
{% with d.hobby.3.username as name %}  # ---> 給這個d.hobby.3.username取別名叫name 
    {{ name }}	# 等同{{ d.hobby.3.username }}
{% endwith %}

自定義過濾器、標籤、inclusion_tag

==============================================================================================================
# 類似於python裡面的自定義函式
1.在'應用下'建立一個名字'必須'叫"templatetags"資料夾
2.在上述資料夾內建立一個'任意'名稱的py檔案
3.在該py檔案內固定先書寫以下兩句話
from django import template
register = template.Library()
==============================================================================================================

# 自定義過濾器(過濾器最多隻能傳兩個引數)
from django import template
register = template.Library()

@register.filter(name='baby')  # name是指定過濾器名字
def my_sum(v1, v2):
    return v1 + v2
前端:
{% load mytags %}
<p>{{ i|baby:666 }}</p>


# 自定義標籤(引數可以有多個)
@register.simple_tag(name='simple_tag')
def func1(a, b, c, d):
    return '%s-%s|%s?%s' % (a, b, c, d)
前端:
{% load mytags %}
{% simple_tag 'hello' 123 'world' 'django'  %}
結果:
hello-123|world?django

# 自定義inclusion_tag
內部原理:
	先定義一個方法
	在頁面上呼叫該方法,並且可以傳值
	該方法會生成一些資料然後傳遞給一個html頁面
	之後講渲染好的結果放在呼叫的位置
@register.inclusion_tag('login.html',name='my_inclusion_tag')
def func2(n):
    l = []
    for i in range(1,n+1):
        l.append('第%s頁'%i)
    return locals()


前端
{% load mytag %}
{{ i|myfilter:666 }}

{% mysimple 1 'jason' 222 'egon' %}

{% my_inclusion_tag 10 %}
{% my_inclusion_tag 8 %}

inclusion_tag
	當某個區域需要反覆使用並且資料不是固定的

模板的匯入

# 類似於後端到模組 想要什麼區域性頁面直接匯入即可

{% include 'myform.html' %}

模板的繼承

先使用block劃定區域
母版
    {% block 區域名稱 %}
    {% endblock %}
子版
	{% extends 'home.html' %}
    {% block 區域名稱 %}
	{% endblock %}
  
母版在劃定區域的時候一般都應該有三個區域
   css區域
   html文件區域
   js區域
   ps:目的是為了讓子版具有獨立的css js等 增加擴充套件性
    {% block css %}

    {% endblock %}
    
    {% block content %}

    {% endblock %}
    
    {% block js %}

    {% endblock %}
 
ps:子版也可以繼續使用母版劃定區域內的內容
    {{ block.super }}

django settings原始碼

"""
1.django其實有兩個配置檔案
	一個是暴露給使用者可以自定義的配置檔案
		專案根目錄下的settings.py
	一個是專案預設的配置檔案
		當用戶不做任何配置的時候自動載入預設配置
2.配置檔案變數名必須是大寫
"""
疑問:為什麼當用戶配置了就使用使用者配置的 不配置就是要預設的
from django.conf import settings

settings = LazySettings()

os.environ.setdefault("DJANGO_SETTINGS_MODULE", "day05.settings")
ENVIRONMENT_VARIABLE = "DJANGO_SETTINGS_MODULE"
class LazySettings(LazyObject):
    def _setup(self, name=None):
        # os.environ看成是一個全域性大字典      'day05.settings'
        settings_module = os.environ.get(ENVIRONMENT_VARIABLE)
        self._wrapped = Settings(settings_module)  # Settings('day05.settings')
 
class Settings(object):
    def __init__(self, settings_module):  # 'day05.settings'
        for setting in dir(global_settings):  # 獲取全域性配置檔案裡面所有的變數名
            if setting.isupper():  # 校驗是否是純大寫
                setattr(self, setting, getattr(global_settings, setting))
                # 給Settings物件新增全域性配置檔案中所有的配置資訊
        
        self.SETTINGS_MODULE = settings_module  # 'day05.settings'
        mod = importlib.import_module(self.SETTINGS_MODULE)
        # from day05 import settings  # 匯入暴露給使用者的自定義配置檔案
        for setting in dir(mod):
            if setting.isupper():
                setting_value = getattr(mod, setting)
                setattr(self, setting, setting_value)