當你考慮開發現代化、高效且可擴展的網站和Web應用時,Django是一個強大的選擇。Django是一個流行的開源Python Web框架,它提供了一個堅實的基礎,幫助開發者快速構建功能豐富且高度定制的Web應用
全套Django筆記直接地址: 請移步這里
共 10 章,31 子模塊
模板
模板使用
1. 配置模板目錄
如果命令行創建的項目,需要手動配置模板文件目錄,如果是Pycharm創建的項目,則無需配置
- 在項目根目錄下創建模板目錄,比如叫
templates
,后續開發模板文件會放在此目錄下 - 在項目的配置文件
settings.py
文件中,進行模板目錄的配置,如下:
2. 定義模板文件
在templates
目錄中新建一個模板文件,如index.html
<!DOCTYPE html>
<html lang="en">
<head><meta charset="UTF-8"><title>Title</title>
</head>
<body><!-- 顯示模板變量 --><h1>{{ name }}</h1></body>
</html>
3. 模板渲染
方式一: 通過render
函數
from django.shortcuts import renderdef index(request):context = {'name': 'django' }# 參數1:請求對象# 參數2:模塊路徑# 參數3:字典數據return render(request, 'index.html', context)
方式二: 通過Template
對象的render
方法
from django.template import loaderdef index(request):# 模板對象template = loader.get_template('index.html') # type: Template# 渲染得到字符串html_str = template.render(context)# 響應請求return HttpResponse(html_str)
模板語法
- 模板變量
- 模板語句
- 過濾器
- 注釋
- 模板繼承
1. 模板變量
變量名必須由字母、數字、下劃線(不能以下劃線開頭)和點組成,語法如下:
{{ 變量 }}
模板變量可以使python的內建類型,也可以是對象。
def index(request):context = {'name': 'django','my_list': ['python', 'java', 'php', 'c/c++'],'my_dict': {'name': 'python','age': 20,'gender': '男',}}return render(request, 'index.html', context)
<!DOCTYPE html>
<html lang="en">
<head><meta charset="UTF-8"><title>Title</title>
</head>
<body><h1>{{ name }}</h1><h1>{{ my_list }}</h1> <h1>{{ my_list.0 }}</h1> <!-- 注意列表的取值方法 --><h1>{{ my_dict }}</h1><h1>{{ my_dict.name }}</h1> <!-- 注意字典的取值方法 -->
</body>
</html>
2. 模板語句
1)for循環:
{% for item in 列表 %}{{forloop.counter}} <1-- 表示當前是第幾次循環,從1開始 -->{{forloop.counter0}} <!-- 表示當前是第幾次循環,從0開始 -->
{% empty %} 列表為空或不存在時執行此邏輯
{% endfor %}
2)if條件:
{% if ... %}邏輯1
{% elif ... %}邏輯2
{% else %}邏輯3
{% endif %}
比較運算符如下:
==
!=
<
>
<=
>=
布爾運算符如下:
and
or
not
注意:運算符左右兩側必須有空格。
{% if a == 1 %} # 正確
{% if a==1 %} # 錯誤
3. 過濾器
語法如下:
- 使用管道符號|來應用過濾器,用于進行計算、轉換操作,可以使用在變量、標簽中。
- 如果過濾器需要參數,則使用冒號:傳遞參數。
變量|過濾器:參數
列舉幾個如下:
- safe,禁用html轉義(顯示html標簽樣式,而不是字符串)
- length,長度,返回字符串包含字符的個數,或列表、元組、字典的元素個數。
- default,默認值,如果變量不存在時則返回默認值。
data|default:'默認值'
-
date,日期,用于對日期類型的值進行字符串格式化,常用的格式化字符如下:
- Y表示年,格式為4位,y表示兩位的年。
- m表示月,格式為01,02,12等。
- d表示日, 格式為01,02等。
- j表示日,格式為1,2等。
- H表示時,24進制,h表示12進制的時。
- i表示分,為0-59。
- s表示秒,為0-59。
value|date:"Y年m月j日 H時i分s秒"
4. 注釋
1)單行注釋語法如下:
{#...#}
2)多行注釋使用comment標簽,語法如下:
{% comment %}
...
{% endcomment %}
5. 模板繼承
- 模板繼承和類的繼承含義是一樣的
- 可以使用模板繼承來復用父模板,提高代碼的復用性,減輕開發人員的工作量。
- 可以通過定義
block
,實現子模板對父模塊內容的重寫
父模板
如果發現在多個模板中某些內容相同,那就可以使用block
標簽把這段內容定義到父模板中。
{% block 塊名稱 %}預留區域,可以編寫默認內容,也可以沒有默認內容
{% endblock %}
子模板
- 使用
extends
標簽繼承父模板,寫在子模板文件的第一行。
{% extends "父模板路徑" %}
-
對有需要的
block
進行重寫:- 不用重寫父模版中的所有block,如果子模版沒有重寫,則使用父模版定義的默認值。
- 可以使用
block.super
來包含父模板的塊中定義的內容,如下
{% block 名稱 %}子模板的內容{{ block.super }} 顯示父模板中block的內容{% endblock %}
數據庫
學習目標
- 能夠進行Django數據庫配置
- 掌握Django中模型類的定義
- 掌握Django中的遷移命令的使用
- 能夠使用Django的ORM進行數據庫的增刪改查
- 能夠說明查詢集QuerySet的特點
- 能夠說明模型類管理器Manager的作用
數據庫
ORM框架
- ORM Object relational mapping 對象關系映射
- 把類和數據庫表對應,把對象和表記錄對應,通過類和對象操作數據庫表中的數據,而不需要編寫SQL語句
-
Django框架實現了ORM 功能:
- 不需要直接面向數據庫編程,通過模型類和對象完成數據表的增刪改查操作
- 自動生成數據庫表
- 通過配置切換使用不同的數據庫
-
ORM 開發步驟
-
配置數據庫
-
定義模型類 (
models.py
) -
執行遷移命令,生成數據庫表
- 生成遷移文件:
python manage.py makemigrations
- 生成數據庫表:
python manage.py migrate
- 默認數據庫為
sqlite3
,數據庫名為:db.sqlite3
- 生成遷移文件:
-
通過模型類和對象操作數據庫
-
數據庫配置和遷移
- Django項目默認
sqlite3
數據庫, 生成的數據庫名為db.sqlite3
sqlite3
僅供測試使用,可以通過配置修改為使用mysql
一、配置使用MySQL數據庫
- 手動創建
MySQL
數據庫,比如叫:db_django01
create database db_django01 charset=utf8;
- 在與項目
setting.py
文件中配置使用mysql
DATABASES = {'default': {# 配置使用mysql'ENGINE': 'django.db.backends.mysql', # 數據庫產品'HOST': "localhost", # 數據庫ip'PORT': 3306, # 數據庫端口'USER': "root", # 用戶名'PASSWORD': "mysql", # 密碼'NAME': "db_django01", # 數據庫名}}
- 在python虛擬環境下安裝 MySQL 驅動
pip install pymysql
- 在
與項目同名的包
下的__init__.py
文件中,初始化MySQL驅動
import pymysqlpymysql.install_as_MySQLdb()
二、遷移命令生成表
打開終端,進入到項目根目錄下,執行以下2個命令,生成數據庫表
1. 生成遷移文件
python manage.py makemigrations
2. 生成數據庫表
python manage.py migrate
3. 查看數據庫表
?
一、需求
定義模型類,保存部門-員工數據
-
部門類(Department)
- 部門名稱: name
- 部門成立時間: create_date
- 邏輯刪除標識:is_delete
-
員工類(Employee)
- 性名: name
- 年齡: age
- 性別: sex
- 工資: salary
- 入職時間: hire_date
- 備注信息: comment
二、模型類定義
- 模型類被定義在
應用/models.py
文件中 - 模型類必須繼承自
Django
的models.Model
類
1. 屬性定義
-
模型類屬性與表字段一一對應
-
定義屬性時,需要指定字段類型,通過字段類型的參數指定選項,格式如下:
- 屬性名 = models.字段類型(字段選項)
-
屬性名不能是python的保留關鍵字
-
屬性名不能使用連續的下劃線(這是由django的查詢方式決定的)
2. 關于主鍵
- 主鍵:primary key,簡寫 pk
- 不需要主動定義,django會自動生成自增長的主鍵,屬性名叫
id
, - 如果開發者自己定義了主鍵,則django不會再生成默認的主鍵
3. 表名
- 默認為:應用名小寫_模型類名小寫
- 可通過通過
Meta
類指定表名,例如
# 如果應用名為users,則默認表名為:users_departmentclass Department(models.Model):...class Meta:# 指定生成的數據庫表的名字db_table = 'department'
4. 字段類型
官方文檔:字段類型和選項
類型 | 說明 |
---|---|
AutoField | 自動增長的IntegerField,通常不用指定,不指定時Django會自動創建名為id的自動增長屬性 |
BooleanField | 布爾字段,值為True或False |
NullBooleanField | 支持Null、True、False三種值 |
CharField | 字符串,必須指定:max_length ,表示最大字符個數 |
TextField | 大文本字段,一般超過4000個字符時使用 |
IntegerField | 整數 |
DecimalField | 十進制浮點數,用python中的Decimal實例來表示必須指定: max_digits 總位數,decimal_places 小數位數。 |
FloatField | 浮點數 |
DateField | 日期1) 參數auto_now 表示每次修改保存對象時,自動設置該字段為當前時間,用于保存"最后一次修改"時間,默認為False;2) 參數auto_now_add 表示當對象第一次被創建時自動設置保存當前時間,用于保存"創建時間"時間,默認為值為False;3) 參數auto_now_add 和auto_now 是相互排斥的,不能同時用到一個屬性中 |
TimeField | 時間,參數同DateField |
DateTimeField | 日期時間,參數同DateField |
FileField | 上傳文件字段 |
ImageField | 繼承于FileField,對上傳的內容進行校驗,確保是有效的圖片 |
4. 字段選項
選項 | 默認值 | 描述 | 是否要遷移修改表結構 |
---|---|---|---|
null | False | True表示表字段允許為空 | 是 |
unique | False | True表示表字段不能重復 | 是 |
db_column | 屬性名稱 | 表字段名稱 | 是 |
primary_key | False | True表示字段設置為了主鍵,一般作為AutoField的選項使用 | 是 |
default | - | 默認值 | 否 |
blank | False | 在django管理后臺新增或編輯一條表數據時,該字段是否允許為空;null是數據庫范疇的概念,blank是表單驗證范疇的 | 否 |
choices | - | 在django管理后臺新增或編輯一條表數據時,該字段顯示為下拉框,默認為編輯框 | 否 |
- choices: 性別屬性使用了choices選項后,在錄入一條數據時,會以下拉框顯示
- blank:blank屬性默認值為false, 表示錄入一條數據時,當前字段必須填寫,不能為空,否則js端js校驗不通過,例如:下圖的comment員工備注信息字段。
5. 外鍵
關系型數據庫的關系包括三種類型
ForeignKey
: 一對多,將關聯屬性
定義在多的一端中ManyToManyField
: 多對多,將關聯屬性
定義任意一方中OneToOneField
: 一對一,將關聯屬性
定義在任意一方中
二、代碼參考
部門和員工模型類 代碼參考
class Department(models.Model):"""部門類"""# 部門名稱:字符串類型(必須要指定最大長度)name = models.CharField(max_length=20)# 部門成立時間: 日期類型create_date = models.DateField(auto_now_add=True)# 邏輯刪除標識:標識部門是否刪除is_delete = models.BooleanField(default=False)def __str__(self):return self.nameclass Meta: # 指定表名db_table = 'department'class Employee(models.Model):"""員工類"""choices_gender = ((0, '男'),(1, '女'),)name = models.CharField(max_length=20)age = models.IntegerField()gender = models.IntegerField(default=0, choices=choices_gender)# 工資:浮點類型(必須要指定兩個選項) 999999.99salary = models.DecimalField(max_digits=8, decimal_places=2)# 備注信息: 可以為空comment = models.CharField(max_length=300, null=True, blank=True)# 員工入職時間hire_date = models.DateField(auto_now_add=True)# 一對多的外鍵:員工所屬部門 department_iddepartment = models.ForeignKey('Department')def __str__(self):return self.nameclass Meta: # 指定表名db_table = 'employee'
交互環境
Django交互環境
- 在Django交互環境中,可以直接執行django項目代碼,類似
ipython
交互環境 - 有以下兩種方式使用Django交互環境
1. 通過 shell
命令進入Django交互環境
python manage.py shell