Django1


1. DJANGO使用指南



Django簡(jiǎn)介:

Django官網(wǎng)地址

Django發(fā)布于2005年7月嘉熊,是當(dāng)前Python世界里最有名且成熟的網(wǎng)絡(luò)框架狮斗。 最初是被開(kāi)發(fā)用于管理勞倫斯出版集團(tuán)旗下的以新聞內(nèi)容為主的網(wǎng)站的,即CMS(內(nèi)容管理系統(tǒng))軟件。

Django是一個(gè)用Python編寫(xiě)的開(kāi)放源代碼的Web應(yīng)用框架郁岩,代碼是開(kāi)源的。此系統(tǒng)采用了MVC的框架模式, 也可以稱為MTV模式


什么是MVC模式

MVC全名是Model View Controller,是模型(model)-視圖(view)-控制器(controller)的縮寫(xiě)刹缝,一種軟件設(shè)計(jì)典范碗暗,用一種業(yè)務(wù)邏輯、數(shù)據(jù)梢夯、界面顯示分離的方法組織代碼言疗,將業(yè)務(wù)邏輯聚集到一個(gè)部件里面,在改進(jìn)和個(gè)性化定制界面及用戶交互的同時(shí)颂砸,不需要重新編寫(xiě)業(yè)務(wù)邏輯噪奄。MVC被獨(dú)特的發(fā)展起來(lái)用于映射傳統(tǒng)的輸入、處理和輸出功能在一個(gè)邏輯的圖形化用戶界面的結(jié)構(gòu)中人乓。 <b>通俗的來(lái)講就是勤篮,強(qiáng)制性的使應(yīng)用程序的輸入,處理和輸出分開(kāi)色罚。</b>

<b>核心思想</b>:解耦

<b>優(yōu)點(diǎn)</b>:減低各個(gè)模塊之間的耦合性碰缔,方便變更,更容易重構(gòu)代碼戳护,最大程度的實(shí)現(xiàn)了代碼的重用

MVC(Model, View, Controller)
Model: 即<font color=red>數(shù)據(jù)存取層</font>手负。用于封裝于應(yīng)用程序的業(yè)務(wù)邏輯相關(guān)的數(shù)據(jù),以及對(duì)數(shù)據(jù)的處理姑尺。說(shuō)白了就是模型對(duì)象負(fù)責(zé)在數(shù)據(jù)庫(kù)中存取數(shù)據(jù)

View: 即<font color=red>表現(xiàn)層</font>竟终。負(fù)責(zé)數(shù)據(jù)的顯示和呈現(xiàn)。渲染的html頁(yè)面給用戶切蟋,或者返回?cái)?shù)據(jù)給用戶统捶。

Controller: 即<font color=red>業(yè)務(wù)邏輯層</font>。負(fù)責(zé)從用戶端收集用戶的輸入柄粹,進(jìn)行業(yè)務(wù)邏輯處理喘鸟,包括向模型中發(fā)送數(shù)據(jù),進(jìn)行CRUD操作驻右。

圖解:


image.png

瀏覽器中MVC的表現(xiàn)形式圖解:


image.png


Django的模式簡(jiǎn)介

MVT模式

嚴(yán)格來(lái)說(shuō)什黑,Django的模式應(yīng)該是MVT模式,本質(zhì)上和MVC沒(méi)什么區(qū)別堪夭,也是各組件之間為了保持松耦合關(guān)系愕把,只是定義上有些許不同。

Model: 負(fù)責(zé)業(yè)務(wù)與數(shù)據(jù)庫(kù)(ORM)的對(duì)象

View: 負(fù)責(zé)業(yè)務(wù)邏輯并適當(dāng)調(diào)用Model和Template

Template: 負(fù)責(zé)把頁(yè)面渲染展示給用戶

注意: Django中還有一個(gè)url分發(fā)器森爽,也叫作路由恨豁。主要用于將url請(qǐng)求發(fā)送給不同的View處理,View在進(jìn)行相關(guān)的業(yè)務(wù)邏輯處理爬迟。


2. VIRTUALENV虛擬環(huán)境創(chuàng)建指南



前言
  1. 本教程中使用到的python版本均為python3.x版本橘蜜,由于本人安裝的是python3.6.3版本,所以一下的課程均是在此基礎(chǔ)上進(jìn)行的付呕。
     

  2. virtualenv使用場(chǎng)景:當(dāng)開(kāi)發(fā)成員負(fù)責(zé)多個(gè)項(xiàng)目的時(shí)候计福,每個(gè)項(xiàng)目安裝的庫(kù)又是有很多差距的時(shí)候跌捆,會(huì)使用虛擬環(huán)境將每個(gè)項(xiàng)目的環(huán)境給隔離開(kāi)來(lái)。
     

    比如象颖,在有一個(gè)老項(xiàng)目已經(jīng)開(kāi)發(fā)維護(hù)了3年了佩厚,里面很多庫(kù)都是比較老的版本了。例如python使用的是2.7版本的力麸。但是新項(xiàng)目使用的python版本是3.6的。為了解決這種項(xiàng)目執(zhí)行環(huán)境的沖突育韩,所以引入了虛擬環(huán)境virtualenv克蚂。

當(dāng)然除了virtualenv可以起到隔離環(huán)境的作用,還有其他技術(shù)方案來(lái)實(shí)現(xiàn)筋讨,而且上線流程簡(jiǎn)單埃叭,大大減輕運(yùn)維人員的出錯(cuò)率,比如每一個(gè)項(xiàng)目使用一個(gè)docker鏡像悉罕,在鏡像中去安裝項(xiàng)目所需的環(huán)境赤屋,庫(kù)版本等等

python環(huán)境的配置

  1. 在cmd中能通過(guò)python去啟動(dòng),如果不行直接跳到第三步
image.png


  1. 在cmd中能通過(guò)pip3啟動(dòng)安裝軟件壁袄,如果不行直接跳到第三步


    image.png


3.配置python環(huán)境和pip環(huán)境


image.png
  1. 確認(rèn)pip安裝成功类早,如果Scritp文件夾下沒(méi)有pip可執(zhí)行文件,則執(zhí)行第五步嗜逻。

  2. 由于python3.6安裝以后涩僻,在Scripts文件中沒(méi)有pip的可執(zhí)行軟件,需要輸入一下命令進(jìn)行安裝

python -m ensurepip
image.png

注:現(xiàn)在在python的安裝文件夾Scripts下就有pip.exe以及easy_install.exe等可執(zhí)行文件了栈顷,就可以使用pip安裝啦~

windows中安裝使用

  1. 安裝virtualenv
pip install  virtualenv
image.png
  1. 創(chuàng)建虛擬環(huán)境

先查看一下安裝虛擬環(huán)境有那些參數(shù)逆日,是必須填寫(xiě)的


image.png

注意兩個(gè)參數(shù):
--no-site-packages和-p參數(shù)


image.png
virtualenv --no-site-packages venv

以下是指定安裝虛擬環(huán)境中的python版本的安裝方式:


image.png


  1. 進(jìn)入/退出env
進(jìn)入 cd env/Scripts/文件夾  在activate命令

退出 deactivate

在pycharm中創(chuàng)建項(xiàng)目方法

image.png

ubuntu中安裝使用

  1. 安裝virtualenv
apt-get install python-virtualenv
  1. 創(chuàng)建包含python3版本的虛擬環(huán)境
virtualenv -p /usr/bin/python3 env

env代表創(chuàng)建的虛擬環(huán)境的名稱

  1. 進(jìn)入/退出env
進(jìn)入 source env/bin/activate

退出 deactivate
  1. pip使用

    查看虛擬環(huán)境下安裝的所有的包

    pip list
    

    查看虛擬環(huán)境重通過(guò)pip安裝的包

    pip freeze
    

3. DJANGO使用指南



創(chuàng)建Django項(xiàng)目

cmd命令創(chuàng)建步項(xiàng)目驟步驟:
1、進(jìn)入創(chuàng)建好的虛擬環(huán)境
2萄凤、去到需要放置項(xiàng)目的文件夾下室抽,新建項(xiàng)目
3、創(chuàng)建好項(xiàng)目后拖動(dòng)到pycharm中打開(kāi)

直接用pycharm創(chuàng)建項(xiàng)目步驟:


image.png
1. 首先創(chuàng)建一個(gè)運(yùn)行Django項(xiàng)目的虛擬環(huán)境(virtualenv)

虛擬環(huán)境的創(chuàng)建在基礎(chǔ)課程中講解靡努,地址
該虛擬環(huán)境中有django庫(kù)坪圾,python3,pymysql等等需要的庫(kù)

大致在羅列下安裝了那些庫(kù):

pip install Django==1.11

pip install PyMySQL
2. 創(chuàng)建一個(gè)Django項(xiàng)目

2.1 創(chuàng)建項(xiàng)目

django-admin startproject halloWorld

該命令是創(chuàng)建一個(gè)名為halloWorld的工程

項(xiàng)目目錄介紹

下面展示創(chuàng)建以后的文件惑朦,具體有哪些文件:


image.png

manage.py: 是Django用于管理本項(xiàng)目的管理集工具神年,之后站點(diǎn)運(yùn)行,數(shù)據(jù)庫(kù)自動(dòng)生成行嗤,數(shù)據(jù)表的修改等都是通過(guò)該文件完成已日。

init.py: 指明該目錄結(jié)構(gòu)是一個(gè)python包,暫無(wú)內(nèi)容栅屏,在后期會(huì)初始化一些工具會(huì)使用到飘千。

seetings.py: Django項(xiàng)目的配置文件堂鲜,其中定義了本項(xiàng)目的引用組件,項(xiàng)目名护奈,數(shù)據(jù)庫(kù)缔莲,靜態(tài)資源,調(diào)試模式霉旗,域名限制等

urls.py:項(xiàng)目的URL路由映射痴奏,實(shí)現(xiàn)客戶端請(qǐng)求url由哪個(gè)模塊進(jìn)行響應(yīng)。

wsgi.py:定義WSGI接口信息厌秒,通常本文件生成后無(wú)需改動(dòng)

2.2 運(yùn)行Django項(xiàng)目

python manage.py runserver 端口

該命令是運(yùn)行項(xiàng)目读拆,端口可以不用寫(xiě),啟動(dòng)的時(shí)候會(huì)默認(rèn)隨機(jī)創(chuàng)建一個(gè)可以使用的端口

2.2 創(chuàng)建app

python manage.py startapp hallo_app

該命令是在blog工程下創(chuàng)建一個(gè)名為hallo_app的app

3. settings.py配置文件詳細(xì)解讀
a) 設(shè)置語(yǔ)言:

LANGUAGE_CODE = 'zh-hans' 表示中文
LANGUAGE_CODE = 'en-us' 表示英文

image.png

設(shè)置時(shí)區(qū): TIME_ZONE = 'Asia/Shanghai'

b) 時(shí)區(qū)解釋: (需要詳細(xì)回顧思考時(shí)區(qū)問(wèn)題)

UTC:世界標(biāo)準(zhǔn)時(shí)間鸵闪,也就是平常說(shuō)的零時(shí)區(qū)檐晕。
北京時(shí)間表示東八區(qū)時(shí)間,即UTC+8

模型使用指南--admin

前言

Djang自身集成了管理后臺(tái)蚌讼,在管理后臺(tái)中可以對(duì)我們自定義model進(jìn)行CRUD操作辟灰,也能進(jìn)行列表展示解析,分頁(yè)等等

使用admin管理后臺(tái)

0. 準(zhǔn)備工作篡石,在model中定義Student的模型
```
class Students(models.Model):
    name = models.CharField(max_length=10)
    sex = models.BooleanField()

    class Meta:
        db_table = 'student'
```
1. admin管理后臺(tái)的url
在工程目錄下可以看到路由配置中有一個(gè)admin的url地址
```
url(r'^admin/', admin.site.urls),
```
2. 創(chuàng)建admin后臺(tái)的用戶密碼
```
python manage.py createsuperuser
```
[圖片上傳失敗...(image-4a4434-1536808795504)]
3. 在登錄后的管理后臺(tái)中對(duì)自定義的模型進(jìn)行CRUD操作
在管理后臺(tái)中操作模型對(duì)象芥喇。需要在app的admin.py中寫(xiě)如下代碼
```
admin.site.register(模型名)
```
4. 繼承admin.ModelAdmin,編寫(xiě)自定義的admin
```
class StudentAdmin(admin.ModelAdmin):
    def set_sex(self):
        if self.sex:
            return '男'
        else:
            return '女'
    set_sex.short_description = '性別'
    list_display = ['id', 'name', set_sex]
    list_filter = ['sex']
    search_fields = ['name']
    list_per_page = 1

admin.site.register(模型名, StudentAdmin)
```

其中:<br>
list_display: 顯示字段  <br>
list_filter: 過(guò)濾字段   <br>
search_fields: 搜索字段 <br>
list_per_page: 分頁(yè)條數(shù) <br>
5. 使用裝飾器去實(shí)現(xiàn)注冊(cè)
```
@admin.register(模型名)
class StudentAdmin(admin.ModelAdmin):
    def set_sex(self):
        if self.sex:
            return '男'
        else:
            return '女'
    set_sex.short_description = '性別'
    list_display = ['id', 'name', set_sex]
    list_filter = ['sex']
    search_fields = ['name']
    list_per_page = 1
```

模型使用指南--models

前言

Django對(duì)數(shù)據(jù)庫(kù)提供了很好的支持凰萨,對(duì)不同的數(shù)據(jù)庫(kù),django提供了統(tǒng)一調(diào)用的API乃坤,我們可以根據(jù)不同的業(yè)務(wù)需求使用不同是數(shù)據(jù)庫(kù)。Django中引入了ORM(Objects Relational Mapping)對(duì)象關(guān)系映射沟蔑,是一種程序技術(shù)湿诊。在下面會(huì)詳細(xì)的講解。

修改mysql配置

1. 在settings.py中配置數(shù)據(jù)庫(kù)連接信息
'ENGINE':'django.db.backends.mysql',
'NAME':'',           #數(shù)據(jù)庫(kù)名
'USER':'',           #賬號(hào)
'PASSWORD':'',       #密碼
'HOST':'127.0.0.1',  #IP(本地地址也可以是localhost)
'PORT':'3306',       #端口
2. mysql數(shù)據(jù)庫(kù)中創(chuàng)建定義的數(shù)據(jù)庫(kù)

a) 進(jìn)入mysql

mysql -u root -p

b) 創(chuàng)建數(shù)據(jù)庫(kù)

create database xxx charset=utf-8;
3. 配置數(shù)據(jù)庫(kù)鏈接

a) 安裝pymysql

pip install pymysql

b) 在工程目錄下的init.py文件中輸入,完成數(shù)據(jù)庫(kù)的驅(qū)動(dòng)加載

import pymysql
pymysql.install_as_MySQLdb()
4. 定義模型瘦材,以及模型數(shù)據(jù)的增刪改查
重要概念:模型厅须,表,屬性食棕,字段

一個(gè)模型類在數(shù)據(jù)庫(kù)中對(duì)應(yīng)一張表朗和,在模型類中定義的屬性,對(duì)應(yīng)模型對(duì)照表中的一個(gè)字段

定義屬性見(jiàn)定義屬性文件地址

創(chuàng)建學(xué)生模型類
class Student(models.Model):

    s_name = models.CharField(max_length=10)
    s_age = models.IntegerField()
    s_gender = models.BooleanField()

    class Meta:
        db_table = 'cd_student'
        ordering =[]
    對(duì)象的默認(rèn)排序字段簿晓,獲取對(duì)象列表時(shí)使用眶拉,升序ordering['id'],降序ordering['-id']
5.遷移數(shù)據(jù)庫(kù)

a) 生成遷移文件

python manage.py makemigrations

遷移成功會(huì)在migrations文件夾下生成0001_initial.py

注意:如果執(zhí)行后并沒(méi)有生成遷移文件憔儿,一直提示No changes detected這個(gè)結(jié)果的話忆植,就要手動(dòng)的去處理了。有兩點(diǎn)處理方式:

1) 先刪除掉pycache文件夾

2) 直接強(qiáng)制的去執(zhí)行遷移命令,python manage.py makemigrations xxx (xxx就是app的名稱)

3) 查看自動(dòng)生成的數(shù)據(jù)庫(kù)朝刊,查看表django_migrations耀里,刪掉app字段為xxx的數(shù)據(jù)(xxx就是app的名稱)

b) 執(zhí)行遷移生成數(shù)據(jù)庫(kù)

python manage.py migrate

注意: 生成遷移文件的時(shí)候,并沒(méi)有在數(shù)據(jù)庫(kù)中生成對(duì)應(yīng)的表拾氓,而是執(zhí)行migrate命令之后才會(huì)在數(shù)據(jù)庫(kù)中生成表

6. ORM

ORM(Objects Relational Mapping)對(duì)象關(guān)系映射冯挎,是一種程序技術(shù),用于實(shí)現(xiàn)面向?qū)ο缶幊陶Z(yǔ)言里不同類型系統(tǒng)的數(shù)據(jù)之間的轉(zhuǎn)換咙鞍》抗伲可以簡(jiǎn)單理解為翻譯機(jī)。

可以理解為把面向?qū)ο蟮拇a续滋,翻譯成數(shù)據(jù)庫(kù)可以看懂的SQL語(yǔ)句

image.png
7.模型查詢
a) 模型成員objects

Django默認(rèn)通過(guò)模型的objects對(duì)象實(shí)現(xiàn)模型數(shù)據(jù)查詢

b) 過(guò)濾器

查詢集表示從數(shù)據(jù)庫(kù)獲取的對(duì)象集合

查詢集可以有多個(gè)過(guò)濾器

過(guò)濾器就是一個(gè)函數(shù)翰守,基于所給的參數(shù)限制查詢的結(jié)果

從SQL角度來(lái)說(shuō),查詢集合和select語(yǔ)句等價(jià)吃粒,過(guò)濾器就像where條件

Django有兩種過(guò)濾器用于篩選記錄

    filter    : 返回符合篩選條件的數(shù)據(jù)集

    exclude   : 返回不符合篩選條件的數(shù)據(jù)集

多個(gè)filter和exclude可以連接在一起查詢

當(dāng)然還有如下這些過(guò)濾器:

all()            返回所有數(shù)據(jù)

filter()     返回符合條件的數(shù)據(jù)(數(shù)據(jù)可以有一個(gè)或者多個(gè))潦俺,條件可以有多個(gè)
 例:類名.objects.filter(條件1拒课,條件2...)

get()  返回符合條件的一條數(shù)據(jù)徐勃,沒(méi)有數(shù)據(jù)會(huì)報(bào)錯(cuò),返回?cái)?shù)據(jù)太多也報(bào)錯(cuò)

exclude()        過(guò)濾掉符合條件的數(shù)據(jù)

order_by()       排序早像,
升序例:類名.objects.order_by(字段) 
降序例:類名.objects.order_by(-字段) 

values()         一條數(shù)據(jù)就是一個(gè)字典僻肖,返回一個(gè)列表
c) 查詢單個(gè)數(shù)據(jù)

get():返回一個(gè)滿足條件的對(duì)象。如果沒(méi)有返回符合條件的對(duì)象卢鹦,會(huì)應(yīng)該模型類DoesNotExist異常臀脏,如果找到多個(gè),會(huì)引發(fā)模型類MultiObjectsReturned異常

first():返回查詢集中的第一個(gè)對(duì)象

last():返回查詢集中的最后一個(gè)對(duì)象

count():返回當(dāng)前查詢集中的對(duì)象個(gè)數(shù)

exists():判斷查詢集中是否有數(shù)據(jù)冀自,如果有數(shù)據(jù)返回True揉稚,沒(méi)有返回False

d) 限制查詢集

限制查詢集,可以使用下表的方法進(jìn)行限制熬粗,等同于sql中的limit

模型名.objects.all()[0:5] 下標(biāo)不能為負(fù)數(shù)搀玖;[:100]結(jié)束索引超出范圍不報(bào)錯(cuò);[100:]起始索引超出范圍也不報(bào)錯(cuò)驻呐,返回空

e) 字段查詢

對(duì)sql中的where實(shí)現(xiàn)灌诅,作為方法,filter(),exclude()含末,get()的參數(shù)

語(yǔ)法:屬性名稱__比較運(yùn)算符 = 值

外鍵:屬性名_id

注意:like語(yǔ)句中使用%表示通配符猜拾。比如sql語(yǔ)句查詢 where name like '%xxx%',等同于filter(name_contains='xxx')

f) 比較運(yùn)算符

contains:是否包含佣盒,大小寫(xiě)敏感
例:模型名.objects.filter(字段名__contains='花'):模糊查詢名字中帶有‘花’的名字

startswith挎袜,endswith:以values開(kāi)頭或者結(jié)尾,大小寫(xiě)敏感
以上的運(yùn)算符前加上i(ignore)就不區(qū)分大小寫(xiě)了
例:模型名.objects.filter(字段名__startswith='花'):模糊查詢名字以‘花’開(kāi)頭的名字

isnull,isnotnull:是否為空宋雏。
例:filter(name__isnull=True) :查詢名字為空的學(xué)生

in:是否包含在范圍內(nèi)芜飘。
例:filter(id__in=[1,2,3]) :查詢id在123的

gt,gte磨总,lt嗦明,lte:大于,大于等于蚪燕,小于娶牌,小于等于。
例:filter(age__gt=10) :查詢年齡大于10

pk:代表主鍵馆纳,也就是id诗良。
例:filter(pk=1) :查詢id為1的

g) 聚合函數(shù)

aggregate()函數(shù)返回聚合函數(shù)的值

Avg:平均值

Count:數(shù)量

Max:最大

Min:最小

Sum:求和

例如: Student.objects.aggregate(Max('age'))

h) F對(duì)象/Q對(duì)象
<b>F對(duì)象:</b>可以使用模型的A屬性與B屬性進(jìn)行比較

背景:在模型中有兩個(gè)字段,分別表示學(xué)生成績(jī)A與成績(jī)B鲁驶,要對(duì)成績(jī)AB進(jìn)行比較計(jì)算鉴裹,就需要使用到F對(duì)象。

例如有如下例子1:

班級(jí)中有女生個(gè)數(shù)字段以及男生個(gè)數(shù)字段钥弯,統(tǒng)計(jì)女生數(shù)大于男生數(shù)的班級(jí)可以如下操作:

grades = Grade.objects.filter(girlnum__gt=F('boynum'))

F對(duì)象支持算數(shù)運(yùn)算

grades = Grade.objects.filter(girlnum__gt=F('boynum') + 10)

例子2:

查詢python班下語(yǔ)文成績(jī)超過(guò)數(shù)學(xué)成績(jī)10分的學(xué)生

    grade = Grade.objects.filter(g_name='python').first()
    students = grade.student_set.all()

    stu = students.filter(s_yuwen__gt= F('s_shuxue') + 10)
<b>Q對(duì)象:</b>Q()對(duì)象就是為了將過(guò)濾條件組合起來(lái)

當(dāng)我們?cè)诓樵兊臈l件中需要組合條件時(shí)(例如兩個(gè)條件“且”或者“或”)時(shí)径荔。我們可以使用Q()查詢對(duì)象

使用符號(hào)&或者|將多個(gè)Q()對(duì)象組合起來(lái)傳遞給filter(),exclude()脆霎,get()等函數(shù)

Q()對(duì)象的前面使用字符“~”來(lái)代表意義“非”

例子1:

查詢學(xué)生中不是12歲的或者姓名叫張三的學(xué)生

student = Student.objects.filter(~Q(age=12) | Q(name='張三'))

例子2:

查詢python班語(yǔ)文小于80并且數(shù)學(xué)小于等于80的學(xué)生

grade = Grade.objects.filter(g_name='python').first()
students = grade.student_set.all()
stu = students.filter(~Q(s_yuwen__gte=80) & Q(s_shuxue__lte=80))

例子3:

查詢python班語(yǔ)文大于等于80或者數(shù)學(xué)小于等于80的學(xué)生

grade = Grade.objects.filter(g_name='python').first()
students = grade.student_set.all()

stu = students.filter(Q(s_yuwen__gte=80) | Q(s_shuxue__lte=80))
delete刪除字段

例:模型名.objects.filter(s_name='小草').filter().delete() :將第一個(gè)名字為小草的人刪除

update更新數(shù)據(jù)

例:模型名.objects.filter(id=1).update(s_name='大大'):將id為1的名字改為‘大大’

8.模型字段定義屬性

定義屬性

概述
    ·django根據(jù)屬性的類型確定以下信息
        ·當(dāng)前選擇的數(shù)據(jù)庫(kù)支持字段的類型
        ·渲染管理表單時(shí)使用的默認(rèn)html控件
        ·在管理站點(diǎn)最低限度的驗(yàn)證

    ·django會(huì)為表增加自動(dòng)增長(zhǎng)的主鍵列总处,每個(gè)模型只能有一個(gè)主鍵列,如果使用選項(xiàng)設(shè)置某屬性為主鍵列后睛蛛,則django不會(huì)再生成默認(rèn)的主鍵列

    ·屬性命名限制
        ·遵循標(biāo)識(shí)符規(guī)則(不使用python預(yù)定義的標(biāo)識(shí)符號(hào)鹦马,內(nèi)置函數(shù)名,異常等忆肾。避免使用下劃線等)
        ·由于django的查詢方式荸频,不允許使用連續(xù)的下劃線



庫(kù)
    ·定義屬性時(shí),需要字段類型客冈,字段類型被定義在django.db.models.fields目錄下旭从,為了方便使用,被導(dǎo)入到django.db.models中

    ·使用方式
        ·導(dǎo)入from django.db import models
        ·通過(guò)models.Field創(chuàng)建字段類型的對(duì)象郊酒,賦值給屬性


邏輯刪除
    ·對(duì)于重要數(shù)據(jù)都做邏輯刪除遇绞,不做物理刪除,實(shí)現(xiàn)方法是定義isDelete屬性燎窘,類型為BooleanField摹闽,默認(rèn)值為False


字段類型
    ·AutoField
        ·一個(gè)根據(jù)實(shí)際ID自動(dòng)增長(zhǎng)的IntegerField,通常不指定如果不指定褐健,一個(gè)主鍵字段將自動(dòng)添加到模型中

    ·CharField(max_length=字符長(zhǎng)度)
        ·字符串付鹿,默認(rèn)的表單樣式是 TextInput

    ·TextField
        ·大文本字段澜汤,一般超過(guò)4000使用,默認(rèn)的表單控件是Textarea

    ·IntegerField
        ·整數(shù)

    ·DecimalField(max_digits=None, decimal_places=None)
        ·使用python的Decimal實(shí)例表示的十進(jìn)制浮點(diǎn)數(shù)
        ·參數(shù)說(shuō)明
            ·DecimalField.max_digits
                ·位數(shù)總數(shù)
            ·DecimalField.decimal_places
                ·小數(shù)點(diǎn)后的數(shù)字位數(shù)

    ·FloatField
        ·用Python的float實(shí)例來(lái)表示的浮點(diǎn)數(shù)

    ·BooleanField
        ·true/false 字段舵匾,此字段的默認(rèn)表單控制是CheckboxInput

    ·NullBooleanField
        ·支持null俊抵、true批狱、false三種值

    ·DateField([auto_now=False, auto_now_add=False])
        ·使用Python的datetime.date實(shí)例表示的日期
        ·參數(shù)說(shuō)明
            ·DateField.auto_now
                ·每次保存對(duì)象時(shí)剑梳,自動(dòng)設(shè)置該字段為當(dāng)前時(shí)間镜遣,用于"最后一次修改"的時(shí)間戳遥倦,它總是使用當(dāng)前日期,默認(rèn)為false
            ·DateField.auto_now_add
                ·當(dāng)對(duì)象第一次被創(chuàng)建時(shí)自動(dòng)設(shè)置當(dāng)前時(shí)間尖殃,用于創(chuàng)建的時(shí)間戳抛计,它總是使用當(dāng)前日期逮栅,默認(rèn)為false
        ·說(shuō)明
            ·該字段默認(rèn)對(duì)應(yīng)的表單控件是一個(gè)TextInput. 在管理員站點(diǎn)添加了一個(gè)JavaScript寫(xiě)的日歷控件蹋辅,和一個(gè)“Today"的快捷按鈕钱贯,包含了一個(gè)額外的invalid_date錯(cuò)誤消息鍵
        ·注意
            ·auto_now_add, auto_now, and default 這些設(shè)置是相互排斥的,他們之間的任何組合將會(huì)發(fā)生錯(cuò)誤的結(jié)果

    ·TimeField
        ·使用Python的datetime.time實(shí)例表示的時(shí)間侦另,參數(shù)同DateField

    ·DateTimeField
        ·使用Python的datetime.datetime實(shí)例表示的日期和時(shí)間秩命,參數(shù)同DateField

    ·FileField
        ·一個(gè)上傳文件的字段

    ·ImageField
        ·繼承了FileField的所有屬性和方法,但對(duì)上傳的對(duì)象進(jìn)行校驗(yàn)褒傅,確保它是個(gè)有效的image


字段選項(xiàng)
    ·概述
        ·通過(guò)字段選項(xiàng)弃锐,可以實(shí)現(xiàn)對(duì)字段的約束
        ·在字段對(duì)象時(shí)通過(guò)關(guān)鍵字參數(shù)指定

    ·null
        ·如果為T(mén)rue,則該字段在數(shù)據(jù)庫(kù)中是空數(shù)據(jù)樊卓,默認(rèn)值是 False

    ·blank
        ·如果為T(mén)rue拿愧,則該字段允許為空白杠河,默認(rèn)值是 False

    ·注意
        ·null是數(shù)據(jù)庫(kù)范疇的概念碌尔,blank是表單驗(yàn)證證范疇的

    ·db_column
        ·字段的名稱,如果未指定券敌,則使用屬性的名稱

    ·db_index
        ·若值為 True, 則在表中會(huì)為此字段創(chuàng)建索引

    ·default
        ·默認(rèn)值

    ·primary_key
        ·若為 True, 則該字段會(huì)成為模型的主鍵字段

    ·unique
        ·如果為 True, 這個(gè)字段在表中必須有唯一值

模型練習(xí)指南

前言

通過(guò)講mysql的系統(tǒng)唾戚,翻譯一遍,在django中通過(guò)創(chuàng)建model去和數(shù)據(jù)庫(kù)中的表進(jìn)行一一映射待诅,并且通過(guò)ORM封裝
的處理方式去練習(xí)這一到習(xí)題叹坦,并寫(xiě)出如下的解題答案

1.數(shù)據(jù)庫(kù)準(zhǔn)備

在model中定義數(shù)據(jù)庫(kù),其中的性別,男的存1卑雁,女的存0募书。
```
class Student(models.Model):
stuname = models.CharField(max_length=20)
studex = models.BooleanField()
stubirth = models.DateField()
stutel = models.CharField(max_length=255)

    class Meta:
        db_table = 'student'
```

2.數(shù)據(jù)庫(kù)遷移

python manage.py makemigrations
python manage.py migrate

3. 數(shù)據(jù)插入

3.1 使用表單form提交post請(qǐng)求數(shù)據(jù)
<form action="/app/addStu/" method="post">
    stuname: <input type="text" name="name">
    stusex: <input type="text" name="sex">
    stubirth: <input type="date" name="birth">
    stutel: <input type="text" name="tel">
    <input type="submit" value="提交">
</form>
3.2 獲取post請(qǐng)求,獲取請(qǐng)求數(shù)據(jù)测蹲,并且創(chuàng)建數(shù)據(jù)
    stu = Student()
    stu.stuname = stuname
    stu.stusex = sex
    stu.stubirth = birth
    stu.stutel = tel
    stu.save()

    方法2:
    Student.objects.create(stuname=stuname, stusex=sex, stubirth=birth, stutel=tel)

4. 查詢所有的學(xué)生信息

使用all()方法獲取所有的數(shù)據(jù)

Student.objects.all()

4. 查詢所有女學(xué)生的姓名和出生日期

Student.objects.filter(stusex=0)
或者
Student.objects.exclude(stusex=1)

其中:
filter():返回符合條件的數(shù)據(jù)
exclude():過(guò)濾掉符合條件的數(shù)據(jù)

5.查詢所有的學(xué)生莹捡,按照id從大到小排序

Student.objects.all().order_by('-id')

其中:
order_by('id'):表示按照id升序的排列
order_by('-id'):表示按照id降序的排列

6. 查詢單個(gè)數(shù)據(jù),就不做演示了扣甲,可以使用一下的方法去獲取

get():返回一個(gè)滿足條件的對(duì)象篮赢。如果沒(méi)有返回符合條件的對(duì)象,會(huì)應(yīng)該模型類DoesNotExist異常,如果找到多個(gè)启泣,會(huì)引發(fā)模型類MultiObjectsReturned異常

first():返回查詢集中的第一個(gè)對(duì)象

last():返回查詢集中的最后一個(gè)對(duì)象

count():返回當(dāng)前查詢集中的對(duì)象個(gè)數(shù)

exists():判斷查詢集中是否有數(shù)據(jù)涣脚,如果有數(shù)據(jù)返回True,沒(méi)有返回False

7.查詢所有80后學(xué)生的姓名寥茫、性別和出生日期(篩選)

Student.objects.filter(stubirth__gte='1980-01-01', stubirth__lte='1990-01-01')

8.查詢名字中有王字的學(xué)生的姓名(模糊)

Student.objects.filter(stuname__contains='王')

9.查詢姓王的學(xué)生姓名和性別(模糊)

Student.objects.filter(stuname__startswith='王')

思考:以什么結(jié)束應(yīng)該怎么寫(xiě)----》 使用endswith

模型加餐使用指南

前言

該文檔中主要介紹模型的對(duì)應(yīng)關(guān)系遣蚀,一對(duì)一,一對(duì)多纱耻,以及多對(duì)多的關(guān)系妙同。并且舉例說(shuō)明
模型對(duì)應(yīng)關(guān)系描述如下:
1:1 一對(duì)一 OneToOneField :關(guān)聯(lián)代碼兩個(gè)模型都可以寫(xiě)

1:N   一對(duì)多 ForeignKey :關(guān)聯(lián)代碼必須寫(xiě)到多的模型中(如:一個(gè)班級(jí)有多個(gè)學(xué)生,那么關(guān)聯(lián)代碼必須寫(xiě)到班級(jí)模型中)

M:N   多對(duì)多 ManyToManyField:關(guān)聯(lián)代碼兩個(gè)模型都可以寫(xiě)膝迎,多對(duì)多遷移后django會(huì)自動(dòng)創(chuàng)建好中間表;add添加粥帚;remove刪除

常見(jiàn)的幾種數(shù)據(jù)關(guān)系,django都提供了很好的支持

1. 一對(duì)一

1.1 模型
    創(chuàng)建學(xué)生的模型:
    class Student(models.Model):
        stu_name = models.CharField(max_length=6, unique=True)
        stu_sex = models.BooleanField(default=0)
        stu_birth = models.DateField()
        stu_delete = models.BooleanField(default=0)
        stu_create_time = models.DateField(auto_now_add=True)
        stu_operate_time = models.DateField(auto_now=True)
        stu_tel = models.CharField(max_length=11)
        stu_yuwen = models.DecimalField(max_digits=3, decimal_places=1, default=0)
        stu_shuxue = models.DecimalField(max_digits=3, decimal_places=1, default=0)

        class Meta:
            db_table = 'stu'

    創(chuàng)建學(xué)生拓展的模型:
    class StuInfo(models.Model):

        stu_addr = models.CharField(max_length=30)
        stu_age = models.IntegerField()
        stu = models.OneToOneField(Student)

        class Meta:
            db_table = 'stu_info'
使用models.OneToOneField()進(jìn)行關(guān)聯(lián)
class StuInfo(models.Model):下是通過(guò)班級(jí)獲取學(xué)生信
    stu = models.OneToOneField(Student)
注意:在數(shù)據(jù)中關(guān)聯(lián)字段名稱叫stu_id
1.2 通過(guò)學(xué)生拓展表去獲取學(xué)生信息
```
    stuinfo = StuInfo.objects.all().first()
    student = stuinfo.stu
```
注意:通過(guò)拓展表去獲取學(xué)生的信息的話限次,語(yǔ)法如下芒涡;
    學(xué)生拓展表的單條對(duì)象.關(guān)聯(lián)字段,即可獲取到學(xué)生表的數(shù)據(jù)
1.3 通過(guò)學(xué)生獲取人信息1
```
    stu = Student.objects.all().first()
    stuInfo = stu.stuinfo
```
注意:通過(guò)學(xué)生獲取關(guān)聯(lián)表的數(shù)據(jù)的話卖漫,語(yǔ)法如下:
    學(xué)生對(duì)象.關(guān)聯(lián)的表名费尽,即可獲取到關(guān)聯(lián)表的數(shù)據(jù)
1.3.1 通過(guò)學(xué)生獲取人信息2
在關(guān)聯(lián)字段OneToOneField中加入?yún)?shù)related_name='xxx'
```
    在
    stu = Student.objects.all().first()
    stuInfo = stu.xxx
```
注意:通過(guò)學(xué)生獲取關(guān)聯(lián)表的數(shù)據(jù)的話,語(yǔ)法如下:
    學(xué)生對(duì)象.關(guān)聯(lián)的字段中定義的related_name參數(shù)羊始,即可獲取到關(guān)聯(lián)表的數(shù)據(jù)
1.4 設(shè)置對(duì)應(yīng)關(guān)系的字段為保護(hù)模式 :
models.CASCADE                      默認(rèn)值
models.PROTECT                  保護(hù)模式
models.SET_NULL                 置空模式
models.SET_DETAULT          置默認(rèn)值
models.SET()     刪除的時(shí)候吃重新動(dòng)態(tài)指向一個(gè)實(shí)體訪問(wèn)對(duì)象元素
on_delete = models.PROTECT

```
修改on_delete參數(shù)
models.OneToOneField('Student', on_delete=models.SET_NULL, null=True)
```
在刪除student對(duì)象的時(shí)候旱幼,stuinfo的關(guān)聯(lián)字段會(huì)設(shè)置為空null=True,如下命令去刪除student的數(shù)據(jù):
```
Student.objects.filter(id=1).delete()
```
1.5 定義on_delete=models.PROTECT
p =  Student.objects.all().first()
p.delete()

注意:這個(gè)時(shí)候去執(zhí)行該業(yè)務(wù)邏輯的方法的時(shí)候會(huì)報(bào)錯(cuò)

image.png

2. 一對(duì)多

2.1 模型
```
    定義一個(gè)班級(jí)類還有學(xué)生類突委,實(shí)現(xiàn)一對(duì)多的關(guān)系:
    先定義班級(jí)類
    Class Grade(models.Model):
        g_name = models.CharField(max_length=16)

    定義student
        class Student:
            s_name = models.CharField(max_length=10)
            s_age = models.IntegerField(default=1)
            s_grade = models.ForeignKey(Grade, on_delete=PROTECT)
```

注意:使用models.ForeignKey關(guān)聯(lián)
獲取對(duì)象元素 grade.student_set

2.2 獲取數(shù)據(jù)

語(yǔ)法:通過(guò)一獲取多的數(shù)據(jù)

公式: <b>一的對(duì)象.多的模型名小寫(xiě)_set</b>

然后在獲取數(shù)據(jù)all(), get(), filter() 等等

如下先通過(guò)學(xué)生去獲取班級(jí)信息:

   stu = Student.objects.first()
   stu.s_grade

如下是通過(guò)班級(jí)獲取學(xué)生信息:

   g = Grade.objects.all().first()
   g.stugrade.all()   ---> 其中stugrade是定義的related_name參數(shù)

重點(diǎn):

定義了related_name字段以后柏卤,只能通過(guò)related_name去反向獲取數(shù)據(jù),在也不能通過(guò)_set方法去獲取數(shù)據(jù)了
2.3 數(shù)據(jù)查詢匀油,正查/反查
# 查詢id=4的學(xué)生的班級(jí)名稱
stu = Student.objects.get(id=4)
grade = stu.s_grade

# 查詢id=1的班級(jí)的所有學(xué)生
grade = Grade.objects.filter(id=1).first()
stus = grade.student_set.all()
2.4 練習(xí)題
2.6 獲取python班下的所有學(xué)生的信息
    gs = Grade.objects.filter(g_name='python')[0]
    allstu = gs.student_set.all()
2.7 獲取python班下語(yǔ)文成績(jī)大于80分的女學(xué)生
    gs = Grade.objects.filter(g_name='python')[0]
    allstu = gs.student_set.filter(stu_yuwen__gte=80)
2.8 獲取python班下語(yǔ)文成績(jī)超過(guò)數(shù)學(xué)成績(jī)10分的男學(xué)生
    gs = Grade.objects.filter(g_name='python')[0]
    allstu = gs.student_set.filter(stu_yuwen__gte=F('stu_shuxue') + 10)
2.9 獲取出生在80后的男學(xué)生缘缚,查看他們的班級(jí)
    gs = Grade.objects.filter(g_name='python')[0]
    allstu = gs.student_set.filter(stu_birth__gte='1980-01-01', stu_birth__lte='1990-01-01')

3. 多對(duì)多

3.1 M:N 模型

定義購(gòu)物車(chē),用戶的例子實(shí)現(xiàn)多對(duì)多:


```
1. 創(chuàng)建用戶模型:
class GoodsUser(models.Model):
u_name = models.CharField(max_length=32)

    2. 創(chuàng)建商品模型:
    class Goods(models.Model):
        g_name = models.CharField(max_length=32)
        g_user = models.ManyToManyField(User)
```
3.2 多對(duì)多表結(jié)構(gòu)
多對(duì)多關(guān)系:
1. 生成表的時(shí)候會(huì)多生成一張表(實(shí)際會(huì)有三張表)
2. 生成的表是專門(mén)用來(lái)維護(hù)關(guān)系的
3. 生成的表是使用兩個(gè)外鍵來(lái)維護(hù)多對(duì)多的關(guān)系
4. 兩個(gè)一對(duì)多的關(guān)系來(lái)實(shí)現(xiàn)多對(duì)多的實(shí)現(xiàn)   
5. 刪除一個(gè)表的數(shù)據(jù)的話敌蚜,中間關(guān)聯(lián)表也要?jiǎng)h除相關(guān)的信息
3.3 中間表數(shù)據(jù)的增(add)刪(remove)
# id=4的用戶添加兩個(gè)商品(id=1,2)
g_user = GoodsUser.objects.get(id=4)
c1 = Goods.objects.get(id=1)
c2 = Goods.objects.get(id=2)

g_user.goods_set.add(c1)
g_user.goods_set.add(c2)


# 刪除id=4的用戶的商品中id=1的商品
g_user.goods_set.remove(c1)
3.4 練習(xí)題
3.4.1 獲取第一個(gè)用戶購(gòu)買(mǎi)了那些商品
```
    gu = GoodsUser.objects.all().first()
    allstu = gu.goods_set.all()
```
3.4.2 獲取指定商品的購(gòu)買(mǎi)用戶信息
```
    g = Goods.objects.filter(id=1)[0]
    g.g_user.all()
```

模板使用指南

前言

在Django框架中桥滨,模板是可以幫助開(kāi)發(fā)者快速生成呈現(xiàn)給用戶頁(yè)面的工具
  模板的設(shè)計(jì)方式實(shí)現(xiàn)了我們MVT重VT的解耦,VT有著N:M的關(guān)系弛车,一個(gè)V可以調(diào)用任意T齐媒,一個(gè)T可以供任意V使用
模板處理分為兩個(gè)過(guò)程
加載
渲染

1. 加載靜態(tài)配置文件

在settings.py中最底下有一個(gè)叫做static的文件夾,主要用來(lái)加載一些模板中用到的資源纷跛,提供給全局使用
這個(gè)靜態(tài)文件主要用來(lái)配置css喻括,html,圖片忽舟,文字文件等

STATIC_URL = ‘/static/’
STATICFILES_DIRS = [
    os.path.join(BASE_DIR, ‘static’)
]

只后在模板中双妨,首先加載靜態(tài)文件淮阐,之后調(diào)用靜態(tài),就不用寫(xiě)絕對(duì)全路徑了

2. 使用靜態(tài)配置文件

a) 加載渲染靜態(tài)配置文件
模板中聲明

{% load static %} 或者 {% load staticfiles %}

在引用資源的時(shí)候使用

{% static ‘xxx’ %} xxx就是相當(dāng)于staticfiles_dirs的一個(gè)位置

b) 直接定義靜態(tài)配置

<img src="/static/images/mvc.png">

其中: 展示static文件夾下有一個(gè)images文件夾刁品,下面有一個(gè)mvc.png的圖片

3. 模板摘要

3.1 模板主要有兩個(gè)部分
HTML靜態(tài)代碼
動(dòng)態(tài)插入的代碼段(挖坑泣特,填坑)也就是block
3.2 動(dòng)態(tài)填充

模板中的動(dòng)態(tài)代碼斷除了做基本的靜態(tài)填充,還可以實(shí)現(xiàn)一些基本的運(yùn)算挑随,轉(zhuǎn)換和邏輯
如下:


image.png

模板中的變量:
視圖傳遞給模板的數(shù)據(jù)
標(biāo)準(zhǔn)標(biāo)識(shí)符規(guī)則
語(yǔ)法 {{ var }}
如果變量不存在状您,則插入空字符串

3.3 模板重的點(diǎn)語(yǔ)法
對(duì)象.屬性或者方法
索引  (student.0.name)


image.png
3.4模板中的小弊端
調(diào)用對(duì)象的方法,不能傳遞參數(shù)
3.5 模板的標(biāo)簽
語(yǔ)法 {% tag %}
作用 a)加載外部傳入的變量
     b)在輸出中創(chuàng)建文本
     c)控制循環(huán)或邏輯

4. if表達(dá)式

格式1:

    {% if 表達(dá)式 %}

    {%  endif %}

格式2:

    {% if表達(dá)式 %}

    {% else %}

    {%  endif %}

格式3:

    {% if表達(dá)式 %}

    {% elif 表達(dá)式 %}

    {%  endif %}


image.png

5. for表達(dá)式

格式1:

    {% for 變量 in 列表 %}

    {% empty %}

    {% endfor %}


image.png

注意:當(dāng)列表為空或者不存在時(shí)兜挨,執(zhí)行empty之后的語(yǔ)句

注意一下用法:
{{ forloop.counter }} 表示當(dāng)前是第幾次循環(huán)膏孟,從1開(kāi)始
{{ forloop.counter0 }} 表示當(dāng)前從第幾次循環(huán),從0開(kāi)始
{{forloop.revcounter}}表示當(dāng)前是第幾次循環(huán)拌汇,倒著數(shù)數(shù)柒桑,到1停
{{forloop.revcounter0}}表示當(dāng)前是第幾次循環(huán),倒著數(shù)數(shù)噪舀,到0停
{{forloop.first}}是否是第一個(gè)      布爾值
{{forloop.last}}是否是最后一個(gè)      布爾值

6. 注釋

6.1 注釋可見(jiàn)魁淳,可運(yùn)行
<!-- 注釋內(nèi)容 -->
6.1 單行注釋注釋不可見(jiàn),不可運(yùn)行

單行注釋(頁(yè)面源碼中不會(huì)顯示注釋內(nèi)容)

{# 被注釋掉的內(nèi)容 #}
6.2 多行注釋注釋不可見(jiàn)与倡,不可運(yùn)行
{% comment %}

{% endcomment %}


image.png

7. 過(guò)濾器

引入過(guò)濾器定義:{{var|過(guò)濾器}}界逛, 作用:在變量顯示前修改
過(guò)濾器有很多,比如add / lower / upper

7.1 加法
    {{ p.page | add:5 }}
    沒(méi)有減法的過(guò)濾器纺座,但是加法里面可以加負(fù)數(shù)
    {{ p.page | add: -5 }}
7.2 修改大小寫(xiě)
    lower / upper : {{ p.pname | lower }} 變?yōu)樾?xiě)或者大寫(xiě)
7.3 傳參數(shù)

過(guò)濾器可以傳遞參數(shù)息拜,參數(shù)需要使用引號(hào)引起來(lái)。比如join: {{ student | join ‘=’ }}
如果值為空則設(shè)置默認(rèn)值:

    默認(rèn)值:default净响,格式{{ var | default value }}
    如果變量沒(méi)有被提供或者為False少欺,空,會(huì)使用默認(rèn)值
7.4 定制日期格式

根據(jù)制定格式轉(zhuǎn)換日期為字符串别惦,處理時(shí)間的就是針對(duì)date進(jìn)行的轉(zhuǎn)換

{{ dateVal | date: ‘y-m-d h:m:s’ }}

如果過(guò)濾器狈茉,定義為小寫(xiě)的y夫椭,則返回的數(shù)據(jù)為兩位的年掸掸。如果寫(xiě)的是大寫(xiě)的Y,則返回的是四位的年

定義小寫(xiě)的m蹭秋,則返回?cái)?shù)字的月份扰付,如果定義大寫(xiě)的M,則返回英文

定義小寫(xiě)的h仁讨,則返回12小時(shí)制度的時(shí)羽莺,如果定義的是大寫(xiě)的H,則返回24小時(shí)制度的時(shí)

7.5 是否轉(zhuǎn)義

HTML轉(zhuǎn)義:
將接收到的數(shù)據(jù)當(dāng)成普通字符串處理還是當(dāng)成HTML代碼來(lái)渲染的一個(gè)問(wèn)題
渲染成html: {{ code | safe }}
還可以使用autoscape渲染:
{{ autoscape off }}
{{ endautoscape }}
不渲染的話:
{{ autoscape on }}
{{ endautoscape }}

7.6 案例
<!--1. 字符串‘Python’轉(zhuǎn)化為大寫(xiě),輸出結(jié)果為:PYTHON-->
{{ 'Python'|upper }}
<!--2. 字符串‘PYTHON’轉(zhuǎn)化為小寫(xiě),輸出結(jié)果為:python-->
{{ 'PYTHON'|lower }}
<!--3. 變量3增加4,輸出結(jié)果為:7-->
{{ 3|add:'4' }}
<!--4. 第一個(gè)字符轉(zhuǎn)化成大寫(xiě)形式,輸出結(jié)果為:Python-->
{{ 'python'|capfirst }}
<!--5. 刪除指定符號(hào)的值,輸出結(jié)果為:studypythonisveryhappy -->
{{ 'study python is very happy'|cut:' ' }}
<!--6. 輸出缺省值,輸出結(jié)果為:nothing-->
{{ ''|default:'nothing' }}
<!--7. 返回第一個(gè)元素,輸出結(jié)果為:p-->
{{ 'python'|first }}
<!--8. 返回最后一個(gè)元素,輸出結(jié)果為:n-->
{{ 'python'|last }}
<!--9. 計(jì)算長(zhǎng)度,輸出結(jié)果為:6-->
{{ 'python'|length }}
<!--10. 隨機(jī)一個(gè)元素,輸出隨機(jī)結(jié)果為:y-->
{{ 'python'|random }}
7.7 django內(nèi)建過(guò)濾器大全
1洞豁、add :將value的值增加2盐固。使用形式為:{{ value | add: "2"}}荒给。
2、addslashes:在value中的引號(hào)前增加反斜線刁卜。使用形式為:{{ value | addslashes }}志电。
3、capfirst:value的第一個(gè)字符轉(zhuǎn)化成大寫(xiě)形式蛔趴。使用形式為:{{ value | capfirst }}挑辆。
4、cut:從給定value中刪除所有arg的值孝情。使用形式為:{{ value | cut:arg}}鱼蝉。
5、date: 格式化時(shí)間格式箫荡。使用形式為:{{ value | date:"Y-m-d H:M:S" }}
6魁亦、default:如果value是False,那么輸出使用缺省值羔挡。使用形式:{{ value | default: "nothing" }}吉挣。例如,如果value是“”婉弹,那么輸出將是nothing
7睬魂、default_if_none:如果value是None,那么輸出將使用缺省值镀赌。使用形式:{{ value | default_if_none:"nothing" }}氯哮,例如,如果value是None商佛,那么輸出將是nothing
8喉钢、dictsort:如果value的值是一個(gè)字典,那么返回值是按照關(guān)鍵字排序的結(jié)果
使用形式:{{ value | dictsort:"name"}}良姆,例如肠虽,
如果value是:
[{'name': 'python'},{'name': 'java'},{'name': 'c++'},]
那么,輸出是:
[{'name': 'c++'},{'name': 'java'},{'name': 'python'}, ]
9玛追、dictsortreversed:如果value的值是一個(gè)字典税课,那么返回值是按照關(guān)鍵字排序的結(jié)果的反序。使用形式:與dictsort過(guò)濾器相同痊剖。
10韩玩、divisibleby:如果value能夠被arg整除,那么返回值將是True陆馁。使用形式:{{ value | divisibleby:arg}}找颓,如果value是9,arg是3叮贩,那么輸出將是True
11击狮、escape:替換value中的某些字符佛析,以適應(yīng)HTML格式。使用形式:{{ value | escape}}彪蓬。例如说莫,< 轉(zhuǎn)化為 &lt;> 轉(zhuǎn)化為 &gt;' 轉(zhuǎn)化為  &#39;" 轉(zhuǎn)化為  &quot;
13、filesizeformat:格式化value寞焙,使其成為易讀的文件大小储狭。使用形式:{{ value | filesizeformat }}。例如:13KB捣郊,4.1MB等辽狈。
14、first:返回列表/字符串中的第一個(gè)元素呛牲。使用形式:{{ value | first }}
16刮萌、iriencode:如果value中有非ASCII字符,那么將其進(jìn)行轉(zhuǎn)化成URL中適合的編碼娘扩,如果value已經(jīng)進(jìn)行過(guò)URLENCODE着茸,改操作就不會(huì)再起作用。使用形式:{{value | iriencode}}
17琐旁、join:使用指定的字符串連接一個(gè)list涮阔,作用如同python的str.join(list)。使用形式:{{ value | join:"arg"}}灰殴,如果value是['a','b','c']敬特,arg是'//'那么輸出是a//b//c
18、last:返回列表/字符串中的最后一個(gè)元素牺陶。使用形式:{{ value | last }}
19伟阔、length:返回value的長(zhǎng)度。使用形式:{{ value | length }}
20掰伸、length_is:如果value的長(zhǎng)度等于arg的時(shí)候返回True皱炉。使用形式:{{ value | length_is:"arg"}}。例如:如果value是['a','b','c']狮鸭,arg是3合搅,那么返回True
21、linebreaks:value中的"\n"將被<br/>替代怕篷,并且整個(gè)value使用</p>包圍起來(lái)历筝。使用形式:{{value|linebreaks}}
22、linebreaksbr:value中的"\n"將被<br/>替代廊谓。使用形式:{{value |linebreaksbr}}
23、linenumbers:顯示的文本麻削,帶有行數(shù)蒸痹。使用形式:{{value | linenumbers}}
24春弥、ljust:在一個(gè)給定寬度的字段中,左對(duì)齊顯示value叠荠。使用形式:{{value | ljust}}
25匿沛、center:在一個(gè)給定寬度的字段中,中心對(duì)齊顯示value榛鼎。使用形式:{{value | center}}
26逃呼、rjust::在一個(gè)給定寬度的字段中,右對(duì)齊顯示value者娱。使用形式:{{value | rjust}}
27抡笼、lower:將一個(gè)字符串轉(zhuǎn)換成小寫(xiě)形式。使用形式:{{value | lower}}
30黄鳍、random:從給定的list中返回一個(gè)任意的Item推姻。使用形式:{{value | random}}
31、removetags:刪除value中tag1,tag2....的標(biāo)簽框沟。使用形式:{{value | removetags:"tag1 tag2 tag3..."}}
32藏古、safe:當(dāng)系統(tǒng)設(shè)置autoescaping打開(kāi)的時(shí)候,該過(guò)濾器使得輸出不進(jìn)行escape轉(zhuǎn)換忍燥。使用形式:{{value | safe}}
33拧晕、safeseq:與safe基本相同,但有一點(diǎn)不同的就是:safe是針對(duì)字符串梅垄,而safeseq是針對(duì)多個(gè)字符串組成的sequence
34防症、slice:與python語(yǔ)法中的slice相同。使用形式:{{some_list | slice:"2"}}
37哎甲、striptags:刪除value中的所有HTML標(biāo)簽.使用形式:{{value | striptags}}
38蔫敲、time:格式化時(shí)間輸出。使用形式:{{value | time:"H:i"}}或者{{value | time}}
39炭玫、title:轉(zhuǎn)換一個(gè)字符串成為title格式奈嘿。
40、truncatewords:將value切成truncatewords指定的單詞數(shù)目吞加。使用形式:{{value | truncatewords:2}}裙犹。例如,如果value是Joel is a slug 那么輸出將是:Joel is ...
42衔憨、upper:轉(zhuǎn)換一個(gè)字符串為大寫(xiě)形式
43叶圃、urlencode:將一個(gè)字符串進(jìn)行URLEncode
46、wordcount:返回字符串中單詞的數(shù)目

8. 運(yùn)算

8.1 乘
    {% widthratio 數(shù) 分母 分子 %}

如下例子: 求數(shù)學(xué)成績(jī)的10倍的結(jié)果
{% widthratio 10 1 stu.stu_shuxue %}

8.2 整除

{{ num|divisibleby:2 }}
注意:該語(yǔ)句的意思是践图,判斷num值是否能被2整除掺冠,如果能的話返回True,不能的話返回False

8.3 ifeuqal判斷相等

{% ifequal value1 value2 %}

{% endifqueal %}

image.png

9. 反向解析

Url 反向解析
{% url ‘namespace:name’ p1 p2 %}

image.png

10. 跨站請(qǐng)求CSRF(Cross Site Request Forgery)

csrf攻擊說(shuō)明

1.用戶C打開(kāi)瀏覽器码党,訪問(wèn)受信任網(wǎng)站A德崭,輸入用戶名和密碼請(qǐng)求登錄網(wǎng)站A;

2.在用戶信息通過(guò)驗(yàn)證后斥黑,網(wǎng)站A產(chǎn)生Cookie信息并返回給瀏覽器,此時(shí)用戶登錄網(wǎng)站A成功眉厨,可以正常發(fā)送請(qǐng)求到網(wǎng)站A;

3.用戶未退出網(wǎng)站A之前锌奴,在同一瀏覽器中,打開(kāi)一個(gè)TAB頁(yè)訪問(wèn)網(wǎng)站B;

4.網(wǎng)站B接收到用戶請(qǐng)求后憾股,返回一些攻擊性代碼鹿蜀,并發(fā)出一個(gè)請(qǐng)求要求訪問(wèn)第三方站點(diǎn)A;

5.瀏覽器在接收到這些攻擊性代碼后,根據(jù)網(wǎng)站B的請(qǐng)求服球,在用戶不知情的情況下攜帶Cookie信息茴恰,向網(wǎng)站A發(fā)出請(qǐng)求。網(wǎng)站A并不知道該請(qǐng)求其實(shí)是由B發(fā)起的有咨,所以會(huì)根據(jù)用戶C的Cookie信息以C的權(quán)限處理該請(qǐng)求琐簇,導(dǎo)致來(lái)自網(wǎng)站B的惡意代碼被執(zhí)行。

csrf的攻擊之所以會(huì)成功是因?yàn)榉?wù)器端身份驗(yàn)證機(jī)制可以通過(guò)Cookie保證一個(gè)請(qǐng)求是來(lái)自于某個(gè)用戶的瀏覽器座享,但無(wú)法保證該請(qǐng)求是用戶允許的婉商。因此,預(yù)防csrf攻擊簡(jiǎn)單可行的方法就是在客戶端網(wǎng)頁(yè)上添加隨機(jī)數(shù)渣叛,在服務(wù)器端進(jìn)行隨機(jī)數(shù)驗(yàn)證丈秩,以確保該請(qǐng)求是用戶允許的。Django也是通過(guò)這個(gè)方法來(lái)防御csrf攻擊的淳衙。

理解如下圖:


image.png

Django中防止跨站請(qǐng)求偽造使用CSRF, 即:客戶端訪問(wèn)服務(wù)器端蘑秽,在服務(wù)器端正常返回給客戶端數(shù)據(jù)的時(shí)候,而外返回給客戶端一段字符串箫攀,等到客戶端下次訪問(wèn)服務(wù)器
端時(shí)肠牲,服務(wù)器端會(huì)到客戶端查找先前返回的字符串,如果找到則繼續(xù)靴跛,找不到就拒絕缀雳。

Django中配置:

  1. 在表單中添加
    {% csrf_token %}
  2. 在settings中的中間件MIDDLEWARE中配置打開(kāi)
    ‘django.middleware.csrf.CsrfViewMiddleware’

11. 模板繼承

11.1 block挖坑不用看了
關(guān)鍵字 block挖坑
{% block xxx %}
{% endblock %}
11.2 extends
extends 繼承,寫(xiě)在開(kāi)頭位置
{% extends ‘父模板路徑’%}
11.3 include
include 加載模型進(jìn)行渲染
{% include ‘模板文件’%}

12. 模板繼承實(shí)戰(zhàn)

12.1 定義基礎(chǔ)模板base.html
<!DOCTYPE html>
<html lang="en">
    <head>
        <meta charset="UTF-8">
        <title>
            {% block title %}
            {% endblock %}
        </title>
        {% block extCSS %}
        {% endblock %}
        {% block extJS %}
        {% endblock %}
    </head>
    {% block indexbody %}
    {% endblock %}
    <body>

    {% block content %}
    {% endblock %}

    {% block footer %}
    {% endblock %}
    </body>
</html>
12.2 定義繼承base.html的base_main.html模板

該base_main.html模板主要用于加載一些公共的js或者css梢睛,其余模板繼承該模板后肥印,可以直接加載定義好的公共的js或者css

{% extends 'base.html' %}

{% block extJS %}
    <script type="text/javascript" src="/static/js/jquery.min.js"></script>
{% endblock %}
12.3 定義首頁(yè)index.html

在首頁(yè)index.html中,我們?cè)趝% block extJS %}中使用{{ block.super }}去加載之前在base_main.html中定義好了的js文件绝葡,將它繼承過(guò)來(lái)深碱,那么在index.html中就會(huì)加載兩個(gè)js文件了。實(shí)現(xiàn)了將公共的js文件或者css文件單獨(dú)提煉出去藏畅,不需要再每個(gè)頁(yè)面中重復(fù)的去寫(xiě)加載js的重復(fù)代碼了敷硅。

{% extends 'base_main.html' %}

{% block title %}
    首頁(yè){{ user.username }}
{% endblock %}

{% block extCSS %}
    <link rel="stylesheet" type="text/css" href="/static/css/public.css" />
{% endblock %}

{% block extJS %}
    {{ block.super }}
    <script type="text/javascript" src="/static/js/public.js"></script>
{% endblock %}

{% block indexbody %}
<frameset rows="100,*" cols="*" scrolling="No" framespacing="0"
    frameborder="no" border="0">
    <frame src="{% url 'app:head' %}" name="headmenu" id="mainFrame" title="mainFrame"><!-- 引用頭部 -->
<!-- 引用左邊和主體部分 -->
    <frameset rows="100*" cols="220,*" scrolling="No"
    framespacing="0" frameborder="no" border="0">
        <frame src="{% url 'app:left' %}" name="leftmenu" id="mainFrame" title="mainFrame">
        <frame src="{% url 'app:grade' %}" name="main" scrolling="yes" noresize="noresize"
    id="rightFrame" title="rightFrame">
    </frameset>
</frameset>
{% endblock %}
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子竞膳,更是在濱河造成了極大的恐慌航瞭,老刑警劉巖诫硕,帶你破解...
    沈念sama閱讀 218,204評(píng)論 6 506
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件坦辟,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡章办,警方通過(guò)查閱死者的電腦和手機(jī)锉走,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,091評(píng)論 3 395
  • 文/潘曉璐 我一進(jìn)店門(mén),熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)藕届,“玉大人挪蹭,你說(shuō)我怎么就攤上這事⌒菖迹” “怎么了梁厉?”我有些...
    開(kāi)封第一講書(shū)人閱讀 164,548評(píng)論 0 354
  • 文/不壞的土叔 我叫張陵,是天一觀的道長(zhǎng)踏兜。 經(jīng)常有香客問(wèn)我词顾,道長(zhǎng),這世上最難降的妖魔是什么碱妆? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 58,657評(píng)論 1 293
  • 正文 為了忘掉前任肉盹,我火速辦了婚禮,結(jié)果婚禮上疹尾,老公的妹妹穿的比我還像新娘上忍。我一直安慰自己,他們只是感情好纳本,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,689評(píng)論 6 392
  • 文/花漫 我一把揭開(kāi)白布窍蓝。 她就那樣靜靜地躺著,像睡著了一般繁成。 火紅的嫁衣襯著肌膚如雪吓笙。 梳的紋絲不亂的頭發(fā)上,一...
    開(kāi)封第一講書(shū)人閱讀 51,554評(píng)論 1 305
  • 那天朴艰,我揣著相機(jī)與錄音观蓄,去河邊找鬼。 笑死祠墅,一個(gè)胖子當(dāng)著我的面吹牛侮穿,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播毁嗦,決...
    沈念sama閱讀 40,302評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼亲茅,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來(lái)了?” 一聲冷哼從身側(cè)響起克锣,我...
    開(kāi)封第一講書(shū)人閱讀 39,216評(píng)論 0 276
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤茵肃,失蹤者是張志新(化名)和其女友劉穎,沒(méi)想到半個(gè)月后袭祟,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體验残,經(jīng)...
    沈念sama閱讀 45,661評(píng)論 1 314
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,851評(píng)論 3 336
  • 正文 我和宋清朗相戀三年巾乳,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了您没。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 39,977評(píng)論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡胆绊,死狀恐怖氨鹏,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情压状,我是刑警寧澤仆抵,帶...
    沈念sama閱讀 35,697評(píng)論 5 347
  • 正文 年R本政府宣布,位于F島的核電站种冬,受9級(jí)特大地震影響镣丑,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜碌廓,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,306評(píng)論 3 330
  • 文/蒙蒙 一传轰、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧谷婆,春花似錦慨蛙、人聲如沸。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 31,898評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)。三九已至异袄,卻和暖如春通砍,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背烤蜕。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 33,019評(píng)論 1 270
  • 我被黑心中介騙來(lái)泰國(guó)打工封孙, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人讽营。 一個(gè)月前我還...
    沈念sama閱讀 48,138評(píng)論 3 370
  • 正文 我出身青樓虎忌,卻偏偏與公主長(zhǎng)得像,于是被迫代替她去往敵國(guó)和親橱鹏。 傳聞我的和親對(duì)象是個(gè)殘疾皇子堪藐,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,927評(píng)論 2 355

推薦閱讀更多精彩內(nèi)容