1. 程式人生 > 其它 >Django微講解(五)

Django微講解(五)

Django微講解(五)

模板語法

1.過濾器(類似於內建函式)

# 1.語法結構
	{{資料物件|過濾器名稱:引數}}  # 過濾器最多隻能額外傳輸一個引數
# 2.常見過濾器
	{{ s1|length }}  # 統計資料的長度
    {{ s1|add:'111' }}  # 算數加法或者是字串加法
    {{ s2|filesizeformat }}  # 將數字轉成合適的檔案計量單位
    判斷當前資料物件對應的布林值:
        {{ s3|default:'前面的值對應的是False就會列印' }}
		{{ s4|default:'前面的值對應的是Ture就會列印前面的值' }}
	{{ ctime|date:'Y-m-d' }}  # 2022-05-16,時間格式化
    {{ s1|slice:'0:5' }}  # 索引切片
    {{ s5|truncatewords:3 }}  # 按照空格擷取指定文字
    {{ s5|truncatechars:7 }}  # 按照字元個數擷取文字,包括後面的三個點
    {{ s5|cut:' ' }}  # 取消指定字元
    {{ s6|safe }}  # 是否取消轉換,意思就是如果一個變數存的是一個HTML語句,想要在前端頁面展示出效果,就可
以使用這一個方法
    '''
    是否取消轉換的後端寫法:
    from django.utils.safestring import mark_safe
    s6 = '<h1>取消轉義</h1>'
    res = mark_safe(s6)
    '''

2.標籤

# 1.語法結構
	{% 名字 ...%}
    {% end名字 %}
	在Django模板語法中寫標籤的時候,只需要寫關鍵字然後按tab鍵就會自動補全
# 2.if判斷
	{% if 條件1 %}
    	子程式碼
	{% elif 條件2 %}
    	子程式碼
	{% else %}
    	子程式碼
	{% endif %}
# 3.for迴圈
	{% for i in res %}
    {% endfor %}
    for迴圈還提供了一個forloop關鍵字,輸出的結果是:
        {'parentloop': {}, 'counter0': 0, 'counter': 1, 'revcounter': 2, 'revcounter0': 1, 'first': True, 'last': False}
        counter0表示從0開始計數,counter表示從1開始計數,first表示是否是第一次for迴圈,last表示是否是最後
一次for迴圈。
        for迴圈還可以與if判斷連用,針對字典for迴圈同樣提供了keys、values、items方法

3.自定義過濾器、標籤、inclusion_tag

# 1.自定義前的準備
	1.在應用下建立一個名為templatetags的資料夾
    2.在該資料夾內建立一個任意名稱的py檔案
    3.在該py檔案先編寫兩行固定的程式碼
    	from diango import template
        register = template.Library()
# 2.自定義過濾器
	@register.filter(is_safe=True)
    def func1(a, b):
        return a + b
    {% load mytag %}
    {{ n1|func1:'666' }}
# 3.自定義簡單標籤,可以接收任意的引數
	@register.simple_tag(name='my_tag')
    def func2(a, b, c, d):
        return a + b + c + d
    {% load mytag %}
	{% my_tag 1 2 3 4 %}  # 引數之間空格隔開即可
# 4.自定義inclusion_tag
	該方法需要先作用與一個區域性頁面,之後將渲染的結果放到呼叫的位置
	@register.inclusion_tag('home.html')  # 作用於頁面
    def func3(n):
        l1 = []
        for i in range(1,1+n):
            l1.append(f'第{i}頁')
        return locals()
    # home.html程式碼,只需要這些程式碼即可,HTML頁面上多餘的刪掉即可
        <ul>
        {% for foo in l1 %}
            <li>{{ foo }}</li>
        {% endfor %}
        </ul>
	# 前端頁面程式碼
        {% load mytag %}
        {% func3 10 %}

模組的匯入及註釋語法

# 1.模組匯入
	類似於將HTML頁面上的區域性頁面做成模組的形式,哪個地方需要直接匯入即可
    示例:{% include 'HTML檔案' %}
# 2.註釋語法
	1.HTML註釋語法:<!---->
	2.Django模板語法註釋語法:{##}
	HTML的註釋語法可以在前端瀏覽器頁面上直接檢視,模板語法的註釋只能在後端檢視,前端瀏覽器檢視不了

模板的繼承

	有很多網站的頁面,大致都是一樣的,只是區域性有所變化,我們就可以使用模板的繼承來實現該需求,模板的繼承
類似於面向物件的繼承,繼承了某個頁面就可以使用該頁面的所有資源。
# 1.現在模板中通過block劃定可以被修改的區域
	{% block content %}
    	可以修改的內容
	{% endblock %}
# 2.子模板繼承模板
	{% extends 'HTML檔案' %}  # HTML檔案也就是模板的檔案
# 3.修改劃定的區域
	{% block content %}
    	修改的內容
	{% endblock %}
# 4.子模板還可以重複使用模板的內容
	{{ block.super }}

前期資料準備

# 1.建立資料庫和表
	class Users(models.Model):
        uid = models.AutoField(primary_key=True)
        name = models.CharField(max_length=255)
        age = models.IntegerField()
        op_time = models.DateTimeField(auto_now=True)  # 年月日欄位
'''
auto_now:每次修改資料的時候都會自動修改當前時間
auto_now_add:在資料被創建出來的時候會自動記錄當前時間,之後不人為修改的情況下保持不變
'''
# 2.記錄資料庫的操作
	1.資料庫正向遷移命令(將類操作對映到表中)
    	python manage.py makemigrations
        python manage.py migrate
	2.資料庫反向遷移命令(將表對映成類)
    	python manage.py inspectdb
# 3.搭建測試環境
	當我們在想要在本地的Django專案中做測試,那麼我們就需要有專門的測試環境,因為Django是一個整體,不允許
單獨操作某個檔案
    1.自己搭建測試環境
    	import os
        if __name__ == "__main__":
            os.environ.setdefault("DJANGO_SETTINGS_MODULE", "djangofour.settings")
            import django
            django.setup()
            '''在下面寫測試程式碼'''
	2.pycharm提供
    	點選pycharm下方的Python Console會自動進入測試環境 

ORM常見操作關鍵字

# 1.all
	查詢所有資料,返回的QuerySet可以看出是列表套物件
    res = models.Users.objects.all()
# 2.filter
	1.括號內填寫篩選條件,不填寫篩選條件相當於all,返回的QuerySet可以看出是列表套物件
    res = models.Users.objects.filter()
	2.想通過主鍵篩選資料,可以直接寫pk,會在自動定位到當前列表的主鍵欄位,無需自己檢視具體欄位名稱
    res = models.Users.objects.filter(pk=1)
    3.獲取結果集中第一個物件,推薦使用封裝的first方法,不會出現索引超出範圍報錯的情況
    res = models.Users.objects.filter(pk=1).first()
    4.括號內支援填寫多個篩選條件,預設是and關係
    res = models.Users.objects.filter(pk=1,name='oscar').first()
    5.只要是QuerySet物件就可以繼續點物件方法,類似於jQuery鏈式操作
    6.獲取結果集中最後一個物件
    res = models.Users.objects.filter().last()
# 3.values
	1.QuerySet可以看成是列表套字典
    res = models.Users.objects.all().values('name','age')
    2.指定欄位,不寫all也表示從所有資料中操作
    res = models.Users.objects.values('name','age')
    3.對結果集欄位進行篩選
    res = models.Users.objects.filter(pk=1).values('name')
    4.QuerySet可以看成是列表套元組
    res = models.Users.objects.all().values_list('name','age')
# 4.去重
	資料物件中如果含有主鍵,不能去重
    res = models.Users.objects.all().distinct()
    res = models.Users.objects.values('name').distinct()  # 對指定欄位去重
# 5.排序
	res = models.Users.objects.order_by('age')  # 預設是升序
    res = models.Users.objects.order_by('-age')  # 降序
    res = models.Users.objects.order_by('age','pk')  # 支援多個欄位依次排序
# 5.取反操作
	res = models.Users.objects.exclude(name='oscar')
# 6.對查詢結果反向排序,只有在order_by排序之後才可以
	res = models.Users.objects.order_by('age').reverse()
# 7.統計結果集中的個數
	res = models.Users.objects.count()
# 8.判斷結果集中是否含有資料,結果返回布林值
	res = models.Users.objects.filter(name='oscar').exists()  # 有了就返回True,沒有就返回False

這裡是IT小白陸祿緋,歡迎各位大佬的指點!!!