1、靜態文件
1、什么是靜態文件
網站所使用的提前已經寫好的文件,如:js,css,第三方組件bootstrap、fontawesome、sweetalter等等
針對所用到的靜態文件放在static文件夾中,需手動創建
2、Django靜態文件配置
1、在settings配置文件中配置
STATIC_URL = '/static/' # 此處是訪問靜態資源的前綴,默認情況下接口前綴名與靜態文件名保持一致 STATICFILES_DIRS = [os.path.join(BASE_DIR, 'static'), os.path.join(BASE_DIR, 'static1'), ] # 此處的static是文件夾路徑,當訪問時,如果前綴相同,會從這個路徑下依次查找資源,都沒有會報錯
2、解決動態綁定問題
在配置文件中STATIC_URL改變static名使前端的HTML代碼都不會改,在templates文件夾下所有HTML文件中動態引入綁定
{% load static %} <link rel="stylesheet" href="{% static 'bootstrap-3.3.7-dist/css/bootstrap.min.css' %}"> <script src="{% static 'bootstrap-3.3.7-dist/js/bootstrap.min.js' %}"></script>
3、form表單中提交方式,默認是get請求,會自動將所請求的數據加在url后
http://127.0.0.1:8000/login/?username=admin&password=123
指定為 method='post' 請求就不會在url后有請求的數據,並且所有的input標簽都要寫name屬性,否則后端接收不到所輸入的內容

action屬性
1、不寫 默認朝當前地址提交數據
2、全路徑
3、后綴(/login)
當發送post請求時,需要先配置文件中注釋掉一行

2、request對象方法
視圖函數應該做到針對不同的請求來做出不同的邏輯處理,比如GET請求應該返回一個HTML文件,POST請求應該獲取用戶提交的數據然后做一系列邏輯處理,所以我們需要判斷請求方式是啥
request對象,用來獲取前端的請求方式
request.method # 結果是GET或POST request.POST # 獲取post請求提交的數據 結果類似於一個大字典,字典的value是列表套字符串 request.POST.get('username') # 只取列表中的最后一個元素,字符串 request.POST.getlist('username') # 獲取整個列表 request.GET # 獲取get請求url后攜帶的數據 結果類似於一個大字典,字典的value是列表套字符串 request.GET.get('username') # 只取列表中的最后一個元素 request.GET.getlist('username') # 獲取整個列表
注意:POST請求,即可以通過request.PSOT獲取數據,也可以通過request.GET獲取攜帶的數據
通常情況下針對不同的請求應該做不同的判斷,但是get請求次數要遠大於post請求,所以我們應該對不是get請求的做判斷,對get請求不做判斷,減少代碼層次結構
def login(request): if request.method == 'POST': return HttpResponse('登錄請求收到') return render(request, 'login.html')
3、pycharm連接數據庫


連接數據庫后可以對數據庫中數據查看與修改數據

4、Django連接數據庫
需要自己手動先創建庫,Django支持MySQL5.5及以上版本
1、先去配置文件中配置相關的參數
DATABASES = { 'default': { 'ENGINE': 'django.db.backends.mysql', # 數據庫類別 'NAME': 'dome1', # 庫名 'HOST': '127.0.0.1', 'POST': 3306, 'USER': 'root', 'PASSWORD': '2694', 'CHARSET': 'utf8' } }
2、在項目名或者應用名下面的__ init__文件中告訴Django使用pymysql連接數據庫而不是默認的自帶mysqldb
import pymysql pymysql.install_as_MySQLdb()
5、Django的ORM簡介
Django的ORM不會幫你創建庫只能幫你創建表
ORM的作用:能夠讓一個不會數據數據庫的也能夠通過Python的面向對象方法,通過句點符來簡單快捷的操作數據
ORM對象關系映射:
類 <<===>> 表
對象 <<===>> 記錄
屬性 <<===>> 字段值
1、先去models.py文件中寫模型類
class User(models.Model): # id可以不創建,Django ORM會自動創建一個名為id的主鍵字段,如果自己創建了主鍵就不會自動創建 # id int primary key auto_increment id = models.AutoField(primary_key=True) username = models.CharField(max_length=64) # 此處的char其實數據庫中的是varchar,且必須提供max_length password = models.CharField(max_length=32) email = models.EmailField(default='1321241@qq.com') # 此處的EmailField在數據庫中是varchar(254) # price為小數字段 總共8位小數位占2位 price = models.DecimalField(max_digits=8,decimal_places=2)
2、每一次從models類中對數據庫進行改變操作都要進行:數據庫遷移命令,兩條命令永遠成對出現,只要動了models.py對數據庫進行操作,就必須要執行數據庫遷移命令
1、將數據庫的改動記錄到(migrations文件夾)中
- python manage.py makemigrations
2、將真正的改動同步到數據庫中
- python manage.py migrate
6、字段的增刪改操作
1、字段的增加
兩種方式:
1、要么給字段設置默認值
2、運行該字段為空
email = models.EmailField(default='1321241@qq.com') # 設置默認值 hobby = models.CharField(null=True, max_length=(64)) # 設置之前設置的字段默認為空
2、字段的刪除
在models中注釋掉對應的字段,執行數據庫遷移命令即可
3、字段的修改
修改models中對應的代碼,執行數據庫遷移命令即可
7、數據的增刪改查操作
1、數據的增加
兩種方式:
1、create()
# 方式一:通過create方法添加數據 user_obj = models.User.objects.create(username=username, password=password)
2、對象的綁定方法
-
先生成一個user對象
-
調用對象的綁定方法
# 方式二:先生成一個user對象,再調用對象的綁定方法 user_obj = models.User(username=username, password=password) user_obj.save()
2、數據的查找
1、查單條和多條指定的數據
filter()
from app01 import models # 相當於SQL語句的select * from user where username='Mr沈' res = models.User.objects.filter(username='Mr沈') # 返回是一個列表套對象,且對象不存在時,不會報錯,返回空列表 user_obj = res.first() # 支持索引取值不支持負索引,但是不建議使用,推薦使用first方法
filter()方法內可以放多個關鍵字參數, 並且多個關鍵字參數之間是and關系
res = models.User.objects.filter(username='Mr沈', password='123') # 相當於SQL語句的select * from User where username='Mr沈' and password='123'
2、查找所有
1、filter() 括號中不放任何參數就是查所有
res = models.User.objects.filter()
2、all() 查詢所有的數據
res = models.User.objects.all()
3、刪除數據
先根據filter過濾出需要刪除的數據全部,再用delete() 方法刪除
models.User.objects.filter(id=delete_id).delete()
4、數據的修改
1、用戶如何獲取需要修改的數據id,可以通過讓前端get請求中攜帶數據id來獲取
<a href="/edit_user/?edit_id={{ user_obj.id }}">編輯</a>
2、根據數據id對數據進行批量修改,兩種方式:
1、方式1:update() 推薦使用
models.User.objects.filter(id=edit_id).update(name=username,password=password)
2、方式2:不推薦使用,因為會將數據庫所有的數據重新寫一遍,效率很慢
# 方式2(了解) # 1 先獲取數據對象 edit_obj = models.User.objects.filter(id=edit_id).first() # 2 再修改對象屬性 edit_obj.name = username edit_obj.password = password # 3 調用對象的綁定方法保存 edit_obj.save()
8、
表關系有:一對一,一對多,多對多
在書寫表關系的時候,要先把基表在models中全部寫出來,之后再考慮外鍵字段,最后要執行數據庫遷移命令
圖書表與出版社表:是一對多的外鍵關鍵關系,外鍵字段應該建立在多的那一方,ForeignKey(to= '')
# 書籍與出版社 是一對多外鍵關系 publish = models.ForeignKey(to='Publish') # 默認關聯字段就是出版社表的主鍵字段 # publish = models.ForeignKey(to=Publish) # to后面也可以直接寫表的變量名 但是需要保證該變量名在當前位置的上方出現
圖書表與作者表:是多對多的外鍵關系,外鍵字段建立在哪張表上都行,外鍵字段推薦建立在查詢頻率較高的那張表中,為了方便后面基於ORM查詢, ManyToManyField(to= '')
# 書籍與作者 是多對多外鍵關系 authors = models.ManyToManyField(to='Author') # 書籍和作者是多對多關系 """ authors字段是一個虛擬字段 不會真正的在表中創建出來 只是用來告訴django orm 需要創建書籍和作者的第三張關系表 """
作者表與作者詳情表:是一對一的外鍵關系,外鍵字段建立在哪張表上都行,推薦建立在查詢頻率較高的那張表中,為了方便后面基於ORM查詢, OneToOneField(to= '')
# 一對一外鍵關系建立 author_detail = models.OneToOneField(to='AuthorDetail')

注意:ForeignKey字段和OneToOneFiled字段在創建表時不管用戶有沒有加_ id后綴都會自動在該字段名后加_id


創建多對多表時,會自動創建第三張中間表

