Django學習——Django settings 原始碼、模板語法之傳值、模板語法之獲取值、模板語法之過濾器、模板語法之標籤、自定義過濾器、標籤、inclusion_tag、模板的匯入、模板的繼承

PENGJUNQIAO發表於2022-05-02

Django settings 原始碼

"""
1.django其實有兩個配置檔案
    一個是暴露給使用者可以自定義的配置檔案
		專案根目錄下的settings.py
    一個是專案預設的配置檔案
		當使用者不做任何配置的時候自動載入預設配置
2.配置檔案變數名必須是大寫
"""
from django.conf import global_settings 
檢視原始碼
global_settings.py
LANGUAGE_CODE = 'en-us'
 ('zh-hans', gettext_noop('Simplified Chinese'))
疑問:為什麼當使用者配置了就使用使用者配置的 不配置就使用預設的
from django.conf import settings

settings = LazySettings()
manage.py檔案
os.environ.setdefault('DJANGO_SETTINGS_MODULE', 'djangoProject.settings')
ENVIRONMENT_VARIABLE = "DJANGO_SETTINGS_MODULE"
class LazySettings(LazyObject):
    def _setup(self, name=None):
        # os.environ看成是一個全域性大字典  'djangoProject.settings'
        settings_module = os.environ.get(ENVIRONMENT_VARIABLE)
        self._wrapped = Settings(settings_module)  # Settings('djangoProject.settings')

class Settings:
    def __init__(self, settings_module):  # 'djangoProject.settings'
        # update this dict from global settings (but only for ALL_CAPS settings)
        for setting in dir(global_settings):  # 獲取全域性配置檔案裡面所有的(大寫)變數名
            if setting.isupper():  # 校驗判斷變數名是否是純大寫
                setattr(self, setting, getattr(global_settings, setting))
                # 給Settings物件新增全域性配置檔案中所有的配置資訊
                # 例如 self.NAME = 'jason'
                # getattr(global_settings, setting) 獲取全域性設定檔案中大寫變數名對應的值
                # 大寫變數名為健,對應的值為值
        # store the settings module in case someone later cares
        self.SETTINGS_MODULE = settings_module  # 'djangoProject.settings'

        mod = importlib.import_module(self.SETTINGS_MODULE)
        # from djangoProject import settings  # 匯入暴露給使用者的自定義配置檔案
        # importlib.import_module 傳入一個字串(專案名字是動態變化的)可以匯入相關模組
        for setting in dir(mod):
            if setting.isupper():
                setting_value = getattr(mod, setting)
                setattr(self, setting, setting_value)

單例模式 反射

功能的可插拔式配置

# import os
# print(os.environ)  # 固定的全域性大字典

# d = {}
# d['name'] = 'jason'
# d.setdefault('xxx','lili')
# print(d)
# print(dir(d))

import importlib # 傳入一個字串可以匯入

模板語法之傳值

 # 傳值方式1:利用字典挨個傳值
return render(request,'index.html',{'i':i,'f':f,'s':s,'l':l,'d':d,'t':t,'se':se,'b':b})
# 傳值方式2:簡單粗暴  locals()將當前名稱空間中所有的變數名全部傳遞給頁面
return render(request,'index.html',locals())

"""
    傳值方式1    傳值精確  不會造成資源浪費
    傳值方式2    傳值粗糙  可能會造成一定的資源浪費
    ps:為了教學方便  我們以後就是用locals()
"""
補充:傳遞函式名和類名都會自動加括號呼叫(模板語法不支援額外的傳參)

模板語法之獲取值

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

模板語法之過濾器

# 類似於python的內建方法
<p>過濾器:將豎槓左側的資料當做第一個引數</p>
<p>統計長度:{{ s|length }}</p>
<p>加法運算:{{ i|add:100 }}</p>
<p>字串拼接:{{ s|add:'love' }}</p>
<p>日期格式:{{ ctime|date:'Y年-m月-d日' }}</p>
<p>預設值:{{ b|default:'中國' }}</p>
<p>預設值:{{ b1|default:'中國' }}</p>
<p>檔案大小:{{ file_size|filesizeformat }}</p>
<p>擷取文字(引號也算 按字元擷取):{{ s|truncatechars:3 }}</p>
<p>擷取文字(引號不算 按空格擷取):{{ s|truncatewords:3 }}</p>
<p>前端取消轉義:{{ h|safe }}</p>
<p>{{ sss }}</p>

轉義
	前端
		<p>前端取消轉義:{{ h|safe }}</p>
	後端
		# 後端取消轉義
    	from django.utils.safestring import mark_safe
    	sss = mark_safe('<h2>學而不思則罔</h2>')
ps:前端程式碼也可以在後端寫好傳入!!!

模板語法之標籤

# 類似於python的流程控制
{% if b1 %}
    <p>有值</p>
{% else %}
    <p>無值</p>
{% endif %} 

{% for foo in l %}
{#    <p>內建物件:{{ forloop }}</p>#}
    <p>{{ foo }}</p>
{% endfor %}
    
{% for foo in s %}
    {% if forloop.first %}
        <p>這是我的第一次</p>
    {% elif forloop.last %}
        <p>這是我的最後一次</p>
    {% else %}
        <p>{{ foo }}</p>
    {% endif %}
    {% empty %}
        <p>傳入的資料是空的 不存在</p>
{% endfor %}
    
"""
{{}}    變數相關
{%%}    邏輯相關
"""
    
# 瞭解
{% with d.username as name %}
    {{ name }}
    {{ name }}
    {{ d.username }}
{% endwith %}

自定義過濾器、標籤、inclusion_tag

# 類似於python裡面的自定義函式
1.在應用下建立一個名字必須叫"templatetags"資料夾
2.在上述資料夾內建立一個任意名稱的py檔案
3.在該py檔案內固定先書寫以下兩句話
	from django import template
	register = template.Library()
    
  
app01\templatetags\mytag.py
from django import template
register = template.Library()
# 自定義過濾器
@register.filter(name='myfilter')
def index(a,b):
    # 簡單的加法運算
    return a + b

index.html
{% load mytag %}
{{ i|myfilter:666 }}

# 自定義標籤
app01\templatetags\mytag.py
@register.simple_tag(name='mysimple')
def func1(a,b,c,d):
    return '%s-%s|%s?%s'%(a,b,c,d)

index.html
{% load mytag %}
{% mysimple 1 'jason' 222 'egon' %}


inclusion_tag
	當某個區域需要反覆使用並且資料不是固定的
    
# 自定義inclusion_tag
app01\templatetags\mytag.py
@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()

index.html
{% load mytag %}
{% my_inclusion_tag 10 %}

djangoProject\templates\login.html
<ul>
    {% for foo in l %}
        <li>{{ foo }}</li>
    {% endfor %}
</ul>

模板的匯入

# 類似於後端匯入模組 想要什麼區域性頁面直接匯入即可
{% include 'myform.html' %}

你學會了什麼都不重要,你學不會什麼都重要

模板的繼承

先使用block劃定區域
母版
	{% block 區域名稱 %}
	{% endblock %}
子版
	{% extends 'home.html'%}
	{% block 區域名稱 %}
	{% endblock %}

例項:
{% extends 'home.html'%}

{% block content %}
    <h1 class="text-center">註冊</h1>
    <form action="">
        <p><input type="text" class="form-control"></p>
        <p><input type="text" class="form-control"></p>
        <input type="submit" class="btn btn-danger btn-block">
    </form>
{% endblock %}

母版在劃定區域的時候一般都應該由三個區域
	css區域
	html文件區域
	js區域
	ps:目的是為了讓子版具有獨立的css js等 增加擴充套件性
	{% block css %}
        
    {% endblock %}
    
	{% block content %}
        
    {% endblock %}
    
	{% block js %}
        
    {% endblock %}
    
ps:子版也可以繼續使用母版劃定區域內的內容
	{{ block.super }}

相關文章