登錄功能:
1、路由訪問如果不加斜杠,內部會重定向加斜杠的路由
所有的html文件都默認卸載templates文件夾下面
所有的(css,js,前端第三方的類庫)默認都放在static文件夾下
html頁面引入外部資源的方式
1、cdn
2、本地
靜態文件配置:
STATIC_URL = '/static/' # 靜態文件配置 STATICFILES_DIRS = [ os.path.join(BASE_DIR,'static') ] # 暴露給外界能夠訪問服務器靜態文件夾下面所有的資源 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請求
request.POST:就是一個大字典,里面存放了客戶端post提交的所有的數據
print(request.POST.get('username')) # 不推薦使用
<QueryDict: {'username': ['william'], 'password': ['123']}>
print(request.POST.getlist('username')) # 推薦使用這種,一次性拿到value列表中所有的元素
這里面value雖然是個列表但是獲取value的時候拿到的卻是單個元素?
默認只會取value列表中的最后一個元素
要是想取列表中的全部的內容需要使用getlist
使用場景:用戶的愛好、多選框...
GET請求原理也相同,使用方法也一樣
建議版本的連接數據庫:
def login(request): if request.method == 'POST': username = request.POST.get("username") password = request.POST.get('password') # print(username, password) conn = pymysql.connect( host='127.0.0.1', port=3306, user='root', password='123456', db='test', charset='utf8', autocommit=True, ) cursor = conn.cursor(pymysql.cursors.DictCursor) cursor.execute("select * from user_info where name=%s and password=%s", (username, password)) user_info = cursor.fetchall() # print(user_info) if user_info: return HttpResponse('login_success!!!') return render(request, 'login.html')
Django連接本地數據庫(Database):
首次使用需要下載數據庫的驅動:
填寫用戶名、密碼以及相對應的數據庫,完成之后可以測試連接一下:
創建完成之后,如果出現無法打開schemas的情況,那就要先右鍵單擊schemas,然后選擇Database Tools工具欄里面的Force Refresh來進行強制刷新。
Django連接數據庫:
1、修改配置文件(內部所有的鍵都需要大些)
DATABASES = { 'default': { 'ENGINE': 'django.db.backends.mysql', 'NAME': 'user_info', 'HOST': '127.0.0.1', 'PORT': 3306, 'USER': 'root', 'PASSWORD': '123456' } }
2、告訴Django用pymysql替換它默認的mysql_db模塊連接數據庫
方式一:在你的項目文件夾下面的__init__.py
import pymysql pymysql.install_as_MySQLdb() # 告訴Django用pymysql代替mysqldb的連接數據庫
方式二:在你的應用文件夾下面的__init__.py
Django中的ORM:
ORM:對象關系映射:
類 --> 表
對象 --> 表記錄
對象點屬性 --> 記錄中的某一個字段對應的值
Django的orm不能自動幫你創建庫,但時候自動幫你創建表
提示:
一個Django項目就是用一個庫,不要多個Django項目使用一個
數據庫遷移(同步)命令(重點):
這兩句話必須同時出現,不能缺少其中的一句。。。
manage.py makemigrations --> 將你的數據庫變動記錄到一個小本本上面
數據庫變動的紀錄
python3 manage.py migrate --> 將你的數據庫變動同步到數據庫中
編寫注冊功能:
def reg(request): if request.method == 'POST': username = request.POST.get('username') password = request.POST.get('password') # # 方式一: # user_obj = models.User.objects.create(name=username, password=password) # user_obj.save() # 對象調用save對象保存到數據庫 # 方式二: user_obj = models.User.objects.create(name=username, password=password) print(user_obj) return HttpResponse("register success!!!") return render(request, 'reg.html')
通過POST請求提交數據到服務端,在服務端將用戶的數據插入到數據庫表中
查詢數據(獲取數據庫信息):
user_list = models.User.objects.all() --> select id, name, password from user;
只要是QuerySet對象就可以點query來查看獲取當前的QuerySet對象的內部的sql語句
query對象支持索引取值,但是不推薦使用,推薦使用自帶的.first()幫你獲取第一條數據
需要注意的點:你獲取到的數據到底是一個queryset對象還是一個數據對象,如果是數據對象的話就一定要調用first方法
<a href="/reg/" class="btn btn-success">添加數據</a> # 注意路:徑的書寫一定要加斜杠 # 利用a標簽href屬性,可以指定頁面跳轉的路徑 # 在a標簽內部添加路徑,可以是全路徑,但是更推薦止血后綴即可
ps:視圖函數必須返回HttpResponse對象
查詢數據的兩種方式:
# 查詢數據的方式一: user = models.User.objects.filter(id=edit_id) # filter當條件不存在的時候,會返回一個空的queryset對象 # 查詢數據的方式二" user_obj = models.User.objects.get(id=edit_id) # 用get可以直接拿到數據對象的本身,但是如果數據不存在就直接報錯
刪除數據:
def delete_user(request): delete_id = request.GET.get('delete_id') models.User.objects.filter(id=delete_id).delete() # return redirect('/userlist/')
.delete會將query內的所有的對象全部刪除
內部重定向:利用return redirect('/userlist/') # 括號里面可以寫 別人的網址,也可以寫自己的路徑,后面的那個反斜杠可以加可以不加,但是推薦加上,避免出現不必要的錯誤。
編輯數據庫中的數據:
修改當前數據對象:
方式一:
user_obj = models.User.object.filter(id=edit_id).frist() user_obj.name = user_name user_obj.save() # 這種方法如果不修改指定的數據就是原先已經存在的數據
方式二:
在編輯的時候,要先找到那一行數據,然后開啟一個新的網頁來進行編輯,編輯完之后,要進行重定向會userlist的頁面。
定向的時候可以直接使用update方法來進行修改數據,在使用update的時候會講那一條字段中的所有信息進行修改 a
提交數據的時候是用post請求提交的數據,然后直接在請求體中將數據拿出來進行修改。。。
# views
def edit(request): if request.method == 'POST': username = request.POST.get("username") password = request.POST.get("password") # 更新數據 edit_id = request.POST.get('edit_id') models.User.objects.filter(id=edit_id).update(name=username, password=password) return redirect('/userlist/') # print(username, password) # edit_id = request.POST.get("username") # print(edit_id) # 更新數據庫 # 現獲取到ID edit_id = request.GET.get('edit_id') # 將該數據查詢出來渲染到一個頁面 # 查詢數據的方式一: user_obj = models.User.objects.filter(id=edit_id).first() # 查詢數據的方式二" # user_obj = models.User.objects.get(id=edit_id) # 拿到的數據的對象,如果數據不存在就直接報錯 # print(user.pk, user.name, user.password) return render(request, 'edit.html', locals())
網頁中的編輯:
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>Title</title> <script src="https://cdn.bootcss.com/jquery/3.4.1/jquery.min.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> </head> <body> <div class="container"> <div class="row"> <h1>編輯數據</h1> <div class="col-md-6 col-md-offset-3"> <form action="" method="post"> <input type="hidden" name="edit_id" value="{{ user_obj.pk }}"> <p>username:<input type="text" name="username" value="{{ user_obj.name }}" class="form-control"></p> <p>password:<input type="text" name="password" value="{{ user_obj.password }}" class="form-control"></p> <input type="submit" class="btn btn-warning"> </form> </div> </div> </div> </body> </html>
修改模型層里面跟表相關的所有的數據,只要你修改了就必須重新執行數據庫遷移命令:
python3 manage.py makemigrations 將你的數據庫變動記錄到一個小本本上面
python3 manage.py migrate 真正操作數據庫
這兩句話是同時出現的,不能缺少其中一句。。。
新建一個字段,
就要添加字段名的默認值,直接添加在CharField中加一個default參數就可以了,就會自動將之前已經存在的數據自動加上你在添加的這個默認值。
刪除一個字段,就直接將那個字段刪掉,然后在執行那兩句話,之后就會自動刪除了
Django請求生命周期:
圖書管理系統表設計:
書籍:id、title、price、publish_id(出版社ID)
作者:id、name、age
出版社:id、name、email
book2author:id、book_id、author_id
在設計表的時候,可以不寫ID,會默認幫你創建一個主鍵ID
創建數據庫表:
class Book(models.Model): # 不寫ID會默認幫你創建一個主鍵ID title = models.CharField(max_length=32) price = models.DecimalField(max_length=8, decimal_places=2, max_digits=2) # 一對多外鍵字段的建立 publish = models.ForeignKey(to='Publish') # 默認是和Publish表的ID字段建立連接 # 多對多外鍵字段建在關聯的兩張表的任意一張都可以 建議你建在查詢頻率比較高的一張 author = models.ManyToManyField(to='Author') # 多對多字段,不會顯示到表的字段中 class Publish(models.Model): name = models.CharField(max_length=32) email = models.CharField(max_length=32) class Author(models.Model): name = models.CharField(max_length=32) age = models.IntegerField(max_length=32)
外鍵字段名 orm會自動在字段名后面加上_id,無論你的后面是否有ID都會在后面加上_id