Django微講解(五)
阿新 • • 發佈:2022-05-17
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小白陸祿緋,歡迎各位大佬的指點!!!