[TOC]css
視圖函數都必須有返回值, 而且返回值都是HttpResponse對象html
默認狀況下, 全部的html文件都是放在templates文件夾內前端
用戶在瀏覽器中輸入網址能訪問到對應的資源, 前提是後端提早開設了該資源的訪問接口python
靜態文件: 網站所使用到的提早寫好的css, js, 第三方前端模塊, 圖片等都叫作靜態資源mysql
默認狀況下, 網站所用到的靜態文件所有會放在static文件夾下,sql
一般狀況下會在static文件夾內再創建文件夾對不一樣靜態文件加以區分,數據庫
例如: css文件夾, js文件夾, font文件夾等,django
django中, 須要本身手動建立靜態文件存放的文件夾bootstrap
禁止瀏覽器使用緩存: f12-->...-->Settings-->Network-->Disable cache後端
STATIC_URL = '/static/' # 訪問靜態資源文件接口前綴 # STATIC_URL = '/xxx/' STATICFILES_DIRS = [ # 靜態資源所在文件夾路徑 os.path.join(BASE_DIR, 'static'), # 將static文件裏的全部資源上線到服務器 os.path.join(BASE_DIR, 'static1') ] # <script src="/xxx/bootstrap-3.3.7-dist/js/bootstrap.min.js"></script>
動態綁定靜態文件, 映射關係: 多<==>一<==>一
多: 動態變化的url後綴, 一: 文件夾路徑, 一: 模板語法內置的static變量
{% load static %} <script src="{% static 'jQuery.3.4.1.js' %}"></script> <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>
get請求也可以攜帶參數
http://127.0.0.1:8000/login/?username=cql&password=123
get請求攜帶參數特色:
在朝後端提交post請求出現403時, 須要去配置文件中註釋掉一行內容,
MIDDLEWARE-->'django.middleware.csrf.CsrfViewMiddleware', 中間件
瀏覽器不管發get請求仍是post請求, 都會執行django後端的視圖函數
獲取前端請求方式: request.method, 大寫的字符串
獲取用戶提交的post請求的數據: request.POST, 至關於字典
''' print(request.POST) # <QueryDict: {'username': ['cql'], 'password': ['123']}> username = request.POST.get('username') password = request.POST.get('password') print(username, type(username)) # cql <class 'str'> print(password, type(password)) # 123 <class 'str'> username_lt = request.POST.getlist('username') print(username_lt, type(username_lt)) # ['cql'] <class 'list'> 用get取值, 默認只取列表最後一個元素, 若是想獲取列表, 需使用getlist '''
獲取用戶提交的get請求的數據: request.GET, 更細粒度獲取數據: request.GET.get, request.GET.getlist
DATABASES = { 'default': { 'ENGINE': 'django.db.backends.mysql', # 指定數據庫類型 'NAME': 'django', # 指定庫的名字 'USER': 'root', # 鍵必須是全大寫 'PASSWORD': 'Cql123456', 'HOST': '127.0.1.1', 'PORT': 3306, 'CHARSET': 'utf8' } }
在項目名或者在應用名下的__inint__
中書寫代碼指定
import pymysql pymysql.install_as_MySQLdb()
orm優勢: 可以讓不會數據庫操做的人也可以簡單方便的操做數據庫
orm缺點: 封裝程度過高, 會出現查詢效率低的問題
去models.py中書寫模型類
from django.db import models class User(models.Model): id = models.AutoField(primary_key=True) # 當不指定主鍵時, django會自動建立一個名爲id的主鍵字段 username = models.CharField(max_length=32) # CharField字段必須指定max_length參數 password = models.CharField(max_length=64)
一個django項目對應一個數據庫
數據庫遷移(同步)命令
python manage.py makemigrations
, 將數據庫的修改記錄到app中的migrations文件夾內,相似於日誌python manage.py migrate
, 將修改操做真正同步到數據庫中增長新字段
''' email = models.EmailField() python manage.py makemigrations 報錯: without a default # 未設置默認值 解決: 1) Provide a one-off default now # 在cmd中直接提供默認值 2) Quit, and let me add a default in models.py # 在models對應的表類中設置默認值或容許爲空, email = models.EmailFieldnull=True) '''
刪除字段: 在models對應的表類中直接註釋掉對應的字段代碼, 而後執行數據庫遷移命令(謹慎使用)
def login(request): if request.method == "POST": username = request.POST.get('username') password = request.POST.get('password') # 數據庫查詢數據, 結果爲列表套數據對象, 能夠用多個and關係的關鍵字參數查詢 data = models.User.objects.filter(username=username) if not data: return HttpResponse('當前用戶不存在!') user_obj = data[0] if user_obj.password == password: return HttpResponse('登陸成功!') return HttpResponse('密碼錯誤!') return render(request, 'login.html')
''' 1. 查詢數據庫中的全部數據展現到前端頁面 2. 前端頁面上針對不一樣的數據都有編輯和刪除按鈕 3. 點擊對應的按鈕能完成對應的操做 ''' def show_user_lt(request): user_lt = models.User.objects.all() # 等價於: models.User.objects.filter() return render(request, 'show_user_lt.html', {'userLt': user_lt}) def add_user(request): # 草稿: 給用戶返回一個添加頁面, 而後用戶輸入提交, 後端獲取數據, 寫入數據庫, 並給重定向到數據展現頁 if request.method == 'POST': username = request.POST.get('username') password = request.POST.get('password') # create新增數據方法返回值爲當前被建立的對象自己 user_obj = models.User.objects.create(username=username, password=password) # print(user_obj, user_obj.username, user_obj.password) return redirect('/show_user_lt/') # 添加成功後跳轉到數據展現頁 return render(request, 'add_user.html') class User(models.Model): username = models.CharField(max_length=32) # 跟數據庫沒有關係, 因此不須要執行數據庫遷移命令 def __str__(self): return self.username # 該返回值必須是字符串類型
{# {% endfor %}#}
, 不會展現到前端, html的註釋會展現到前端
def edit_user(request): """ 草稿: 返回一個編輯頁面, 該頁面上應該展現想要編輯的用戶信息 利用get請求攜帶參數的方式, 獲取用戶想要編輯的數據的id值 將用戶想要編輯的數據查詢出來, 展現到編輯頁面上, 供用戶修改 """ edit_id = request.GET.get('edit_id') edit_obj = models.User.objects.filter(id=edit_id).first() # 不推薦索引取值 if request.method == 'POST': username = request.POST.get('username') password = request.POST.get('password') # 修改數據方法: 批量操做, 會將filter查詢出來的列表中的全部對象所有更新 models.User.objects.filter(id=edit_id).update(username=username, password=password) return redirect('/show_user_lt/') return render(request, 'edit_user.html', {'edit_obj': edit_obj})
<!--在show_user_lt頁面中經過模板語法爲每條數據的編輯按鈕設置不一樣的get請求攜帶參數--> <tbody> {% for user_obj in userLt %} <tr> <td> <a href="/edit_user/?edit_id={{ user_obj.id }}" class="btn">編輯</a> </td> </tr> {% endfor %} </tbody>
def delete_user(request): delete_id = request.GET.get('delete_id') # 刪除數據方法: 批量操做, 會將filter查詢出來的列表中的全部對象所有刪除 models.User.objects.filter(id=delete_id).delete() return redirect('/show_user_lt/')