def user_list(request):
# 1.獲取user表中所有的資料展示到html頁面上
user_data = models.UserInfo.objects.filter() # 括號內不填篩選條件等價於查所有
# QuerySet[物件1,物件2] 列表套物件
# 2.利用模版語法傳遞資料到html頁面並完成處理最終返回給瀏覽器展示
return render(request,'user_list.html',{'user_data':user_data})
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Title</title>
<script src="https://cdn.bootcdn.net/ajax/libs/jquery/3.6.1/jquery.js"></script>
{# <link rel="stylesheet" href="bootstrap-3.4.1-dist/css/bootstrap.css">#}
{# <script src="bootstrap-3.4.1-dist/js/bootstrap.js"></script>#}
{% load static %}
<link rel="stylesheet" href="{% static 'bootstrap-3.4.1-dist/css/bootstrap.min.css' %}">
<script src="{% static 'bootstrap-3.4.1-dist/js/bootstrap.min.js' %}"></script>
</head>
<body>
<div class="container">
<div class="row">
<h1 class="text-center">資料展示頁</h1>
<div class="col-md-8 col-md-offset-2">
<table class="table table-hover table-striped">
<thead>
<tr>
<th>ID</th>
<th>Name</th>
<th>Password</th>
<th>Age</th>
<th class="text-center">Operation</th>
</tr>
</thead>
<tbody>
{% for user_obj in user_data %} # 接收Django提供的模板語法傳過來的字典資料
<tr>
<td>{{ user_obj.id }}</td>
<td>{{ user_obj.name }}</td>
<td>{{ user_obj.password }}</td>
<td>{{ user_obj.age }}</td>
<td class="text-center">
<a href="" class="btn btn-primary btn-xs">編輯</a>
<a href="" class="btn btn-danger btn-xs">刪除</a>
</td>
</tr>
{% endfor %}
</tbody>
</table>
<a href="/user_login/" class="btn btn-block btn-success">登入使用者</a>
<a href="/user_register/" class="btn btn-block btn-danger">註冊使用者</a>
</div>
</div>
</div>
</body>
</html>
def user_register(request):
#2.根據不同的請求方式做不同的處理
if request.method == 'POST':
# 3.獲取使用者相關資料
username_data = request.POST.get('name') # name age password是前端表單中name屬性定義的
age_data = request.POST.get('age') # 這裡的資料是前端頁面使用者資料的資料
password_data = request.POST.get('password')
# 繼續一些小的判斷
if len(username_data) == 0 or len(password_data) == 0:
return HttpResponse("使用者名稱或年齡不能為空")
user_data = models.UserInfo.objects.filter(name=username_data) # 使用者輸入的username拿去和資料庫中已經存在的使用者比較
if user_data:
return HttpResponse('使用者名稱已經存在') # 不存在將用模型語法建立一個新使用者資料
models.UserInfo.objects.create(name=username_data,age=age_data,password=password_data)
# 重定向到資料展示頁
return redirect('/user_list/')
# 1.先返回一個獲取註冊新使用者資料的html頁面
return render(request, 'register.html')
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Title</title>
<script src="https://cdn.bootcdn.net/ajax/libs/jquery/3.6.1/jquery.js"></script>
{# <link rel="stylesheet" href="bootstrap-3.4.1-dist/css/bootstrap.css">#}
{# <script src="bootstrap-3.4.1-dist/js/bootstrap.js"></script>#}
{% load static %}
<link rel="stylesheet" href="{% static 'bootstrap-3.4.1-dist/css/bootstrap.min.css' %}">
<script src="{% static 'bootstrap-3.4.1-dist/js/bootstrap.min.js' %}"></script>
</head>
<body>
<div class="container">
<div class="row">
<h1 class="text-center">註冊使用者</h1>
<div class="col-md-6 col-md-offset-3">
<form action="" method="POST">
<p>使用者名稱:
<input type="text" name="name" class="form-control">
</p>
<p>年齡:
<input type="text" name="age" class="form-control">
</p>
<p>密碼:
<input type="text" name="password" class="form-control">
</p>
<input type="submit" value="註冊" class="btn btn-warning btn-block">
</form>
</div>
</div>
</div>
</body>
</html>
ps:注意這裡的a是get請求
def user_login(request):
# 2.根據不同的請求方式做不同的處理
if request.method == 'POST':
# 3.獲取使用者相關資料
username_data = request.POST.get('name') # 這裡傳的是input中name的值
age_data = request.POST.get('age')
password_data = request.POST.get('password')
# 繼續一些小的判斷
if len(username_data) == 0 or len(password_data) == 0:
return HttpResponse("使用者名稱或年齡不能為空")
user_data = models.UserInfo.objects.filter(name=username_data,password=password_data) # 這裡是拿出資料庫的值(等號前面)和瀏覽器的值比較
if user_data:
return HttpResponse('登入成功')
return HttpResponse('該使用者不存在')
# models.UserInfo.objects.create(name=username_data, age=age_data, password=password_data)
# 重定向到資料展示頁
# return redirect('/user_list/')
# 1.先返回一個獲取註冊新使用者資料的html頁面
return render(request, 'login.html')
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Title</title>
<script src="https://cdn.bootcdn.net/ajax/libs/jquery/3.6.1/jquery.js"></script>
{# <link rel="stylesheet" href="bootstrap-3.4.1-dist/css/bootstrap.css">#}
{# <script src="bootstrap-3.4.1-dist/js/bootstrap.js"></script>#}
{% load static %}
<link rel="stylesheet" href="{% static 'bootstrap-3.4.1-dist/css/bootstrap.min.css' %}">
<script src="{% static 'bootstrap-3.4.1-dist/js/bootstrap.min.js' %}"></script>
</head>
<body>
<div class="container">
<div class="row">
<h1 class="text-center">登入使用者</h1>
<div class="col-md-6 col-md-offset-3">
<form action="" >
<p>使用者名稱:
<input type="text" name="name" class="form-control">
</p>
<p>密碼:
<input type="text" name="password" class="form-control">
</p>
<input type="submit" value="登入" class="btn btn-danger btn-block">
</form>
</div>
</div>
</div>
</body>
</html>
然後去瀏覽器位址列輸入http://127.0.0.1:8010/login,就可以得到以下頁面,當然在資料展示頁面點選登入也可以跳到當頁面
在輸入框輸入存在的使用者名稱和密碼,則會看到頁面會返回到HttpResponse結果
def user_edit_func(request):
# 1.獲取使用者想要編輯的資料主鍵值
target_edit_id = request.GET.get('edit_id')
# 4.根據不同的請求處理不同的邏輯
if request.method == 'POST':
name_data = request.POST.get('name')
age_data = request.POST.get('age')
if len(name_data) == 0 or len(age_data) == 0:
return HttpResponse('使用者名稱或年齡不能為空')
models.User.objects.filter(pk=target_edit_id).update(name=name_data, age=age_data)
# 5.重定向到資料展示頁
return redirect('/user_list/')
# 2.根據主鍵值獲取對應的資料
target_edit_obj = models.User.objects.filter(pk=target_edit_id)[0] # QuerySet [物件1,物件2,...]
# 3.返回一個編輯資料的頁面 並且該頁面上需要提前展示出原來的資料
return render(request, 'userEditPage.html', {'target_edit_obj': target_edit_obj})
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Title</title>
<script src="https://cdn.bootcdn.net/ajax/libs/jquery/3.6.1/jquery.js"></script>
{% load static %}
<link rel="stylesheet" href="{% static 'bootstrap-3.4.1-dist/css/bootstrap.min.css' %}">
<script src="{% static 'bootstrap-3.4.1-dist/js/bootstrap.min.js' %}"></script>
</head>
<body>
<div class="container">
<div class="row">
<h1 class="text-center">資料編輯頁</h1>
<div class="col-md-6 col-md-offset-3">
<form action="" method="post">
<p>name:
<input type="text" name="name" class="form-control" value="{{ target_edit_obj.name }}">
</p>
<p>age:
<input type="text" name="password" class="form-control" value="{{ target_edit_obj.password }}">
</p>
<input type="submit" value="編輯使用者" class="btn btn-primary btn-block">
</form>
</div>
</div>
</div>
</body>
</html>
ps:這裡需要注意的兩個點,也是我第一次寫的時候,由於邏輯沒有理清,少寫了edit_id引數在user_list.html檔案中需要用get請求傳的引數,所以出現了IndexError: list index out of range錯誤
def user_delete(request):
target_delete_id = request.GET.get('delete_id')
models.UserInfo.objects.filter(pk=target_delete_id).delete()
return redirect('user_list')
<td class="text-center">
<a href="/user_edit/?edit_id={{ user_obj.pk }}" class="btn btn-primary btn-xs">編輯</a>
<a href="/user_delete/?delete_id={{ user_obj.pk }}" class="btn btn-danger btn-xs delBtn">刪除</a>
</td>
ps: 二次確認冒泡事件
<script>
$('.delBtn').click(function () {
let res = confirm('你確定要刪除嘛?')
if (res){
{# 如果點選確定 則執行事件冒泡 #}
}else{
return false {# 如果點選取消 則阻止事件冒泡 #}
}
})
</script>
瀏覽器
傳送請求(HTTP協定)
web服務閘道器介面
1.請求來的時候解析封裝
響應走的時候打包處理
2.django預設的wsgiref模組不能承受高並行 最大隻有1000左右
上線之後會替換成uwsgi來增加並行量
3.WSGI跟wsgiref和uwsgi是什麼關係
WSGI是協定
wsgiref和uwsgi是實現該協定的功能模組
django後端
1.django中介軟體
類似於django的保安 門戶
2.urls.py 路由層
識別路由匹配對應的檢視函數
3.views.py 檢視層
網站整體的業務邏輯
4.templates資料夾 模版層
網站所有的html檔案
5.models.py 模型層
ORM