## 1.常用命令 `創建項目:django-admin startproject 項目名` `創建APP(進入工程目錄):python manage.py startapp 網站名` `創建庫表(進入工程目錄):python manage.py makemigrations` `執行庫表建立(進入 ...
1.常用命令
創建項目:django-admin startproject 項目名
創建APP(進入工程目錄):python manage.py startapp 網站名
創建庫表(進入工程目錄):python manage.py makemigrations
執行庫表建立(進入工程目錄):python manage.py migrate
啟動運動:python manage.py runserver
模板渲染嵌入語法:在html可以嵌入後臺語言 區分符號-》> {%命令%} {{變數}}
2.編寫setting
在INSTALLED_APPS里添加APP的目錄名進去
改語言 LANGUAGE_CODE = 'zh-hans'
3.在APP目錄創建templates文件夾
渲染文件,用於存放html文件
4.編寫APP下的views
def index(request):
return render(request,'index.html')
5.編寫項目urls(路由)
from myblog import views #導入views
path('',views.index) #路由頁面
#path轉換器:
int:<int:page>
str:<str:name>
slug:<slug:xxx> #匹配帶符號的文本
path:<path:xxx> #匹配地址包括/
#name命名
#模板中使用:{% url 'name' %}
#url反向解析
path('index',views.index,name='index_name') #路由頁面
{% url 'name' %}
{% url 'name' '參數值1' '參數值2' %}
{% url 'name' age='參數值1' name='參數值2' %} #命名傳參
6.在項目init下配置Mysql
import pymysql
pymysql.install_as_MySQLdb()
7.setting中配置MySQL
DATABASES = {
'default': {
'ENGINE': 'django.db.backends.mysql', # 資料庫引擎
'NAME': 'django_mysql', # 資料庫名
'USER': 'root', # 賬號
'PASSWORD': 'root', # 密碼
'HOST': '127.0.0.1', # HOST
'POST': 3306, # 埠
}
}
8.models.py模板
class Student(models.Model):
"""
創建如下幾個表的欄位
"""
# 學號 primary_key=True: 該欄位為主鍵
studentNum = models.CharField('學號', primary_key=True, max_length=15)
# 姓名 字元串 最大長度20
name = models.CharField('姓名', max_length=20)
# 年齡 整數 null=False, 表示該欄位不能為空
age = models.IntegerField('年齡', null=False)
# 性別 布爾類型 預設True: 男生 False:女生
sex = models.BooleanField('性別', default=True)
# 手機 unique=True 該欄位唯一
mobile = models.CharField('手機', unique=True, max_length=15)
# 創建時間 auto_now_add:只有在新增的時候才會生效
createTime = models.DateTimeField(auto_now_add=True)
# 修改時間 auto_now: 添加和修改都會改變時間
modifyTime = models.DateTimeField(auto_now=True)
# 指定表名 不指定預設APP名字——類名(app_demo_Student)
class Meta:
db_table = 'student' #表名
verbose_name = '學生' # 在admin站點中顯示的名稱
verbose_name_plural = verbose_name # 顯示的複數名稱
def __str__(self):
"""定義每個數據對象的顯示信息"""
return self.name
#定義英雄模型類HeroInfo
class HeroInfo(models.Model):
GENDER_CHOICES = (
(0, 'male'),
(1, 'female')
)
hname = models.CharField(max_length=20, verbose_name='名稱')
hgender = models.SmallIntegerField(choices=GENDER_CHOICES, default=0, verbose_name='性別')
hcomment = models.CharField(max_length=200, null=True, verbose_name='描述信息')
hbook = models.ForeignKey(BookInfo, on_delete=models.CASCADE, verbose_name='圖書') # 外鍵
is_delete = models.BooleanField(default=False, verbose_name='邏輯刪除')
class Meta:
db_table = 'tb_heros'
verbose_name = '英雄'
verbose_name_plural = verbose_name
def __str__(self):
return self.hname
資料庫表名:模型類如果未指明表名,Django預設以 小寫app應用名_小寫模型類名 為資料庫表名。
可通過db_table 指明資料庫表名。
9.資料庫的增刪改查
查詢數據
Student.objects.all() #獲取表中全部數據
Student.objects.all().order_by('-id') #id倒序
Student.objects.filter(name='tom1') #過濾查詢
Student.objects.get(name='tom1') #獲取一條數據,沒有就報錯
Student.objects.count() #查詢結果數量
Student.objects.values('colums') # 只返回指定欄位,字典
Student.objects.values_list('colums') # 只返回指定欄位,元組
過濾查詢
實現SQL中的where功能,包括
- filter 過濾出多個結果
- exclude 排除掉符合條件剩下的結果
- get 過濾單一結果
1)相等
exact:表示判等。
例:查詢編號為3的圖書。
BookInfo.objects.filter(id__exact=3)
# 可簡寫為:
BookInfo.objects.filter(id=3)
2)模糊查詢
contains:是否包含。
說明:如果要包含%無需轉義,直接寫即可。
例:查詢書名包含’游’的圖書。
BookInfo.objects.filter(btitle__contains='游')
startswith、endswith:以指定值開頭或結尾。
例:查詢書名以’記’結尾的圖書
BookInfo.objects.filter(btitle__endswith='記')
以上運算符都區分大小寫,在這些運算符前加上i表示不區分大小寫,如iexact、icontains、istartswith、iendswith.
3) 空查詢
isnull:是否為null。
例:查詢書名不為空的圖書。
BookInfo.objects.filter(btitle__isnull=False)
4) 範圍查詢
in:是否包含在範圍內。
例:查詢編號為1或3或5的圖書
BookInfo.objects.filter(id__in=[1, 3, 5])
5)比較查詢
gt :大於 (greater then)
gte :大於等於 (greater then equal)
lt :小於 (less then)
lte :小於等於 (less then equal)
例:查詢編號大於3的圖書
BookInfo.objects.filter(id__gt=3)
不等於的運算符,使用exclude()過濾器。
例:查詢編號不等於3的圖書
BookInfo.objects.exclude(id=3)
6)日期查詢
year、month、day、week_day、hour、minute、second:對日期時間類型的屬性進行運算。
例:查詢1980年發表的圖書。
BookInfo.objects.filter(bpub_date__year=1980)
例:查詢1980年1月1日後發表的圖書。
BookInfo.objects.filter(bpub_date__gt=date(1990, 1, 1))
F對象
之前的查詢都是對象的屬性與常量值比較,兩個屬性怎麼比較呢? 答:使用F對象,被定義在django.db.models中。
語法如下:
F(屬性名)
例:查詢閱讀量大於等於評論量的圖書。
from django.db.models import F
BookInfo.objects.filter(bread__gte=F('bcomment'))
可以在F對象上使用算數運算。
例:查詢閱讀量大於2倍評論量的圖書。
BookInfo.objects.filter(bread__gt=F('bcomment') * 2)
聚合函數
使用aggregate()過濾器調用聚合函數。聚合函數包括:Avg(平均),Count(數量),Max(最大),Min(最小),Sum(求和),被定義在django.db.models中。
例:查詢圖書的總閱讀量。
from django.db.models import Sum
BookInfo.objects.aggregate(Sum('bread'))
# 註意aggregate的返回值是一個字典類型
排序
使用order_by對結果進行排序
BookInfo.objects.all().order_by('bread') # 升序
BookInfo.objects.all().order_by('-bread') # 降序
增加數據
create方式插入
通過 模型類.objects.create()保存。
HeroInfo.objects.create(
hname='沙悟凈',
hgender=0,
hbook=book
)
save方式插入
from app_demo.models import Student
import random
"""
插入測試數據
"""
def insert(request):
# 隨機整數 作為學號
for i in range(0, 5):
studentNum = int(random.uniform(0, 1) * 10000000000)
# 從models文件中獲取student對象
student = Student()
# 給對象賦值
student.studentNum = studentNum
student.name = 'tom' + str(i)
student.age = 15
student.sex = random.choice([True, False])
student.mobile = int(random.uniform(0, 1) * 10000000000)
# 插入數據
student.save()
return HttpResponse('數據插入完畢')
from datetime import date
book = BookInfo(
btitle='西游記',
bput_date=date(1988,1,1),
bread=10,
bcomment=10
)
book.save()
修改數據
def modify(request, studentNum):
# 通過學號獲取student對象
student = Student.objects.get(studentNum=studentNum)
# 設置student的name為jack
student.name = 'jack'
student.save()
return HttpResponse('修改成功.')
save
修改模型類對象的屬性,然後執行save()方法
hero = HeroInfo.objects.get(hname='豬八戒')
hero.hname = '豬悟能'
hero.save()
update
使用模型類.objects.filter().update(),會返回受影響的行數
HeroInfo.objects.filter(hname='沙悟凈').update(hname='沙僧')
刪除數據
def delete(request, studentNum):
student = Student.objects.get(studentNum=studentNum)
student.delete()
return HttpResponse('刪除成功.')
10.將models轉換為json
from django.core import serializers
tools = Tools.objects.all()
json_data = serializers.serialize('json', tools)
json_data = json.loads(json_data)
11.CORS跨域配置
下載corsheader
pip install django-cors-headers
修改setting.py中配置
在INSTALLED_APPS中增加corsheaders
INSTALLED_APPS = [
'django.contrib.admin',
'django.contrib.auth',
'django.contrib.contenttypes',
'django.contrib.sessions',
'django.contrib.messages',
'django.contrib.staticfiles',
'corsheaders',#這是我們的主角,放在新建的其他項目之前
'app01',
]
MIDDLEWARE = [
'django.middleware.security.SecurityMiddleware',
'django.contrib.sessions.middleware.SessionMiddleware',
'corsheaders.middleware.CorsMiddleware', #註意順序,必須放在這兒
'django.middleware.common.CommonMiddleware',
'django.middleware.csrf.CsrfViewMiddleware',
'django.contrib.auth.middleware.AuthenticationMiddleware',
'django.contrib.messages.middleware.MessageMiddleware',
'django.middleware.clickjacking.XFrameOptionsMiddleware',
]
setting 里再進行這樣的配置
CORS_ORIGIN_ALLOW_ALL = True
CORS_ALLOW_CREDENTIALS = True
#允許所有的請求頭
CORS_ALLOW_HEADERS = ('*')
12.模板標簽
if:
{% if %}
{% endif %}
for:
{% for i in list %}
{% empty %}
{% endfor %}
for內置變數-forloop:
變數 | 描述 |
---|---|
forloop.counter | 迴圈的當前迭代(從1開始索引) |
forloop.counter0 | 迴圈的當前迭代(從0開始索引) |
forloop.revcounter | counter值的倒序 |
forloop.revcounter0 | counter0值的倒序 |
forloop.first | 如果是第一次迴圈,則為真 |
forloop.last | 如果是最後一次迴圈,則為真 |
forloop.parenloop | 當嵌套迴圈,parentloop表示外層迴圈 |
模板過濾器
語法:{{ 變數 | 過濾器1:'參數值1' | 過濾器2:'參數值2' ...}}
常用過濾器
過濾器 | 說明 |
---|---|
lower | 將字元串轉換為全部小寫 |
upper | 將字元串轉會為大寫形式 |
safe | 預設不對變數內的字元串進行html轉義 |
add:"n" | 將value的值增加n |
truncatechars:'n' | 如果字元串字元多於指定的字元數量,那麼會被截斷。截斷的字元串將以可翻譯的省略號序列(“.….")結尾。 |
模板繼承
父模板:
{% block block_name %}
{% endblock %}
子模板:
開頭使用:{% extends %}
{% block block_name %} #block_name與父模板對應
{% endblock %}
簡化變數
{& with val.xxx as i &}
{% endwith %}