登錄功能
1.路由訪問如果不加斜杠 會內部自動重定向加斜杠的路由
所有的html文件默認都寫在templates文件夾下
所有的靜態文件(css,js,前端第三方類庫)默認都放在static文件夾下
html頁面引入外部資源的方式
cdn
本地
靜態文件配置
使用靜態文件之前需要在settings里進行文件配置
暴露給外界能夠訪問服務器靜態文件夾下面所有的資源
STATIC_URL = '/xxx/' # 接口前綴 跟你的靜態文件夾的名字一點關系都沒有 # 默認情況下這個前綴跟靜態文件夾名字一樣!!! # 靜態文件配置 STATICFILES_DIRS = [ os.path.join(BASE_DIR,'static'), # 就是你的靜態文件夾路徑 os.path.join(BASE_DIR,'static1'), os.path.join(BASE_DIR,'static2') ] # ps:會依次查找列表中所有的靜態文件路徑 找到的話立刻停止,都沒有找到返回404
form表單觸發提交數據的動作兩種方式
<input type="submit"> <button></button>
form提交數據的地址如何指定及方式?
action屬性控制提交的地址 方式: 1.全路徑 <form action="http://127.0.0.1:8000/login/"> 2.只寫路徑后綴 <form action="/login/"> 3.不寫 (默認往當前路徑提交) form表單默認是get請求
views邏輯判斷
根據客戶端請求方式的不同執行不同的邏輯代碼 def login(request): # 獲取用戶端提交的請求方式 print(request.method) # 拿到的請求方式是全大寫的字符串 if request.method == 'GET': return render(request,'login.html') elif request.method == 'POST': return HttpResponse("收到了 老弟") 個人建議按照下面這種方式書寫 減少代碼冗余及結構混亂的問題 def login(request): if request.method == 'POST': return HttpResponse('OK') return render(request,'login.html')
def login(request): # 獲取用戶端提交的請求方式 print(request.method) # 拿到的請求方式是全大寫的字符串 # if request.method == 'GET': # return render(request,'login.html') # elif request.method == 'POST': # return HttpResponse("收到了 老弟") if request.method == 'POST': print(request.POST) # 你就把它當成一個大字典里面存放了客戶端post提交的所有的數據 # request.POST:< QueryDict: {'username': ['jason'], 'password': ['123']} > print(request.POST.get('username')) # value雖然是個列表但是獲取value的時候拿到卻是單個元素 # 默認只會取value列表里面的最后一個元素 # request.POST:<QueryDict: {'username': ['jason', 'egon'], 'password': ['123']}> print(request.POST.getlist('username')) # 要想一次性獲取value列表里面所有的數據需要用getlist() # ['jason', 'egon'] print(request.POST['password']) # 不推薦使用該方法獲取數據 return HttpResponse('OK') return render(request,'login.html') 獲取value列表里面所有的元素需要使用getlist 應用場景:用戶的愛好 多選框 get只會獲取到value列表的最后一個元素 print(request.GET) # <QueryDict: {'username': ['jason'], 'password': ['123']}> request.GET.get('user') # <QueryDict: {'username': ['jason','egon'], 'password': ['123']}> request.GET.getlist('username')
django連接數據庫
1.需要修改配置文件
DATABASES = { 'default': { 'ENGINE': 'django.db.backends.mysql', 'NAME': 'day54', 'HOST':'127.0.0.1', 'PORT':3306, 'USER':'root', 'PASSWORD':'123' } } ps:鍵必須都是大寫
2.告訴django用pymysql替換它默認mysqldb模塊連接數據庫
方式1:在你的項目文件夾下面的__init__.py 方式2:也可以在你的應用文件夾下面的__init__.py # 固定寫法 import pymysql pymysql.install_as_MySQLdb() # 告訴django用pymysql代替mysqldb連接數據庫
什么是ORM?
對象關系映射
類 》》》 表
對象 》》》 表記錄
對象的屬性 》》》 一條記錄某個字段對應的值
django的orm不能夠自動幫你創建庫,但是可以自動幫你創建表
提示:一個django項目就使用一個庫,不要多個django項目使用一個庫
編寫模型類
屬性=models.字段類型(選項)
django會為表創建自動增長的主鍵列,每個模型只能有一個主鍵列,如果使用選項設置某屬性為主鍵列后django不會再創建自動增長的主鍵列。
默認創建的主鍵列屬性為id,可以使用pk代替,pk全拼為primary key。
字段類型
首先導入 import django.db.models AutoField:自動增長的IntegerField,通常不用指定,不指定時Django會自動創建屬性名為id的自動增長屬性。 BooleanField:布爾字段,值為True或False。 NullBooleanField:支持Null、True、False三種值。 CharField(max_length=字符長度):字符串。TextField:大文本字段,一般超過4000個字符時使用。 參數max_length表示最大字符個數。 IntegerField:整數。 DecimalField(max_digits=None, decimal_places=None):十進制浮點數。FloatField:浮點數。 參數max_digits表示總位數。 參數decimal_places表示小數位數。 DateField[auto_now=False, auto_now_add=False]):日期。TimeField:時間,參數同DateField。 參數auto_now表示每次保存對象時,自動設置該字段為當前時間,用於"最后一次修改"的時間戳,它總是使用當前日期,默認為false。 參數auto_now_add表示當對象第一次被創建時自動設置當前時間,用於創建的時間戳,它總是使用當前日期,默認為false。 參數auto_now_add和auto_now是相互排斥的,組合將會發生錯誤。 DateTimeField:日期時間,參數同DateField。 FileField:上傳文件字段。 ImageField:繼承於FileField,對上傳的內容進行校驗,確保是有效的圖片。
關系
1 一對多關系 models.ForignKey() 外鍵約束 定義在多類中 2 多對多關系 models.ManyToManyField() 定義在哪一個都行 3 一對一關系 models.OntoOneField() 定義在哪一個類都可以
選項
通過選項實現對字段的約束,選項如下:
null:如果為True,表示允許為空,默認值是False。
blank:如果為True,則該字段允許為空白,默認值是False。
對比:null是數據庫范疇的概念,blank是表單驗證證范疇的。
db_column:字段的名稱,如果未指定,則使用屬性的名稱。
db_index:若值為True, 則在表中會為此字段創建索引,默認值是False。
default:默認值。
primary_key:若為True,則該字段會成為模型的主鍵字段,默認值是False,一般作為AutoField的選項使用。
unique:如果為True, 這個字段在表中必須有唯一值,默認值是False。
數據庫遷移(同步)命令(******)
python3 manage.py makemigrations 將你的數據庫變動記錄到一個小本本上(並不會幫你創建表)
python3 manage.py migrate 將你的數據庫變動正在同步到數據庫中
新增數據
# 操作數據庫user表插入數據 # 方式1: user_obj = models.User.objects.create(name=username,password=password) # 方式2: user_obj = models.User(name=username,password=password) user_obj.save() # 對象調用save方法保存到數據庫
查詢數據
user_list = models.User.objects.all() # 獲取user表所有的數據 # 只要是QuerySet就可以點query查看獲取到當前QuerySet對象的內部sql語句 print(user_list.query) 利用a標簽href屬性 可以指定頁面跳轉的路徑 href可以寫全路徑 但是推薦寫后綴即可 <a href="/reg/" class="btn btn-success">添加數據</a> # 注意 路徑的書寫一定要加斜杠 重定向 可以寫別人的網址也可以是自己的路徑 return redirect('/userlist') return redirect('/userlist/') queryset對象支持索引取值 但是不推薦你使用 推薦使用自帶的.first()幫你獲取第一條數據
刪除數據
models.User.objects.filter(id=1).delete() # 會將queryset所有的數據對象全部刪除
查詢數據需要注意的是你獲取到的到底是一個queryset還是一個數據對象 user_query = models.User.objects.filter(id=edit_id).first() # 如果你是要獲取數據對象first千萬別忘了 # filter當條件不存在的情況下會返回一個空的queryset對象 <QuerySet []> <class 'django.db.models.query.QuerySet'> user_obj = models.User.objects.get(id=edit_id) # 用get可以直接獲取到數據對象本身但是查詢條件不存在的情況下直接報錯
編輯對象的id的獲取方式
方式1:利用input隱藏一個標簽 <input type="hidden" name="edit_id" value="{{ user_obj.pk }}"> 方式2: <form action="/edit/?edit_id={{ user_obj.pk }}" method="post">
修改數據
注意:queryset對象點修改 刪除 會作用於對象內部所有的數據對象 類似於批量操作 方式1: models.User.objects.filter(id=edit_id).update(name=username,password=password) 方式2:獲取到當前數據對象 user_obj = models.User.objects.filter(id=edit_id).first() user_obj.name = username user_obj.save()
修改模型層里面的跟表相關的所有的數據,只要你修改了就必須重新執行數據庫遷移命令
外鍵字段名 orm會自動在字段名后面加_id.無論你的字段名有沒有_id