一、創建django項目
通過命令創建:
django-admin startproject 項目名稱
創建app應用
python3 manage.py startapp 應用名 #這里manage.py是創建完成django項目后產生的文件
到此步基礎的創建完成,
把新增的app應用添加到配置文件中去

命令行創建django項目沒有templates文件夾,這個文件夾是存放html文件的
手動創建一個templates文件夾,把這個文件夾添加到配置文件中去

到這里就可以啟動django項目了
准備:
1、需要提前創建好數據庫,設置好表格字段,遷移生成數據庫表(ORM)
1.1、修改現有數據庫連接方式,修改settings文件:
DATABASES = { 'default': { 'ENGINE': 'django.db.backends.mysql', 'NAME': 'book_system', 'HOST': '192.168.100.100', 'PORT': '3306', 'USER': 'root', 'PASSWORD': 'root' } }
1.2、在__init__.py文件中添加:
import pymysql pymysql.install_as_MySQLdb()
1.3、在app應用目錄中的models.py文件中添加生成數據庫表格字段的語句內容:
from django.db import models
# Create your models here.
class User(models.Model):
id=models.AutoField(primary_key=True)
# 定義varchar字段
username=models.CharField(max_length=32)
password=models.CharField(max_length=32)
def __str__(self):
return self.username
1.4、數據庫遷移
#執行命令,將數據庫中的變動記錄到一個文件中去 python3 manage.py makemigrations # 將數據庫變動同步到數據庫中 python3 manage.py migrate
1.4.1、記錄數據庫中變動記錄的文件:


1.5、查看數據庫中表是否創建完成,字段是否正確:

2.1、設置靜態文件
html頁面引入外部資源的兩種方式
通過cdn方式在線獲取
使用本地static目錄中存放的外部資源
創建一個static文件夾,把bootstrap程序放到次目錄中去,也可以不放,使用cdn在線獲取

靜態文件配置
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
二、通過django做一個登錄功能
views文件加入模塊
HttpResponse:返回字符串
render:返回html並且支持模板渲染
redirect:重定向
既可以重定向到別人的網址也可以定向到自己的

1.1、設置urls路徑:
url(r'^login/', views.login),
1.2、根據路徑需要在哎views.py文件中創建login函數
def login(request): if request.method=='POST': username = request.POST.get('username') # 獲取前台提交的用戶 password = request.POST.get('password') # 獲取前台提交的密碼 user_list=models.User.objects.filter(username=username,password=password).first() print(user_list) if user_list: return HttpResponse('登錄成功') return render(request, 'login.html')
======================================================================================================
下面這些是介紹:
def login(request):
print(request.method) # 查看用戶獲取的請求方式是get還是post請求
if request.method == 'POST':
username = request.POST.get('username') # 獲取前台提交的用戶
password = request.POST.get('password') # 獲取前台提交的密碼
conn = pymysql.connect(
host='192.168.100.100',
port=3306,
user='root',
password='root',
database='book_system',
charset='utf8',
autocommit=True
)
cursor = conn.cursor(pymysql.cursors.DictCursor)
cursor.execute('select * from userinfo where username=%s and password=%s',(username, password))
user_info = cursor.fetchall()
if user_info:
return HttpResponse('登錄成功')
return render(request,'login.html')
# if request.method == 'GET':
# return render(request, 'login.html')
# # get請求傳遞值獲取和post方式一樣,單個用get,多個用getlist
# elif request.method == 'POST':
# <QueryDict: {'username': ['test1', 'test2', 'test3'], 'password': ['1111111111111']}>
# print(request.POST)
# print(request.POST.get('username')) # 只會獲取最后一個值test3
# print('=======================')
# print(request.POST.getlist('username')) # 全部獲取列表的形式展示出來['test1', 'test2', 'test3']
===========================================================================================================
這里需要調用到login.html文件,在templates中設置login.html文件
<!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>
<scrip src="/static/bootstrap-3.3.7/js/bootstrap.min.js"></scrip>
<link rel="stylesheet" href="/static/bootstrap-3.3.7/css/bootstrap.min.css">
</head>
<body>
<div class="container">
<div class="row">
<h1>登錄頁面</h1>
<div class="col-md-6 col-md-offset-3">
<form action="" method="post"> {# from表單默認是get請求,修改為post請求}
<p>username:<input type="text" class="form-control" name="username"></p>
<p>password:<input type="password" class="form-control" name="password"></p>
<input type="submit" class="btn btn-success">
</form>
</div>
</div>
</div>
</body>
</html>
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請求
三、查看數據
def userlist(request):
# 獲取數據庫用戶數據
user_list=models.User.objects.all() #獲取數據庫中所有數據
# print(user_list.query) # 只要是queryset對象就可以獲取當前queryset對象的語句
# for user_obj in user_list:
# print(user_obj.pk,user_obj.username)
return render(request,'userlist.html',locals()) #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>
<script src="https://cdn.bootcss.com/twitter-bootstrap/3.4.1/js/bootstrap.min.js"></script>
<link href="https://cdn.bootcss.com/twitter-bootstrap/3.4.1/css/bootstrap.min.css" rel="stylesheet">
</head>
<body>
<div class="container">
<div class="row">
<h1>數據展示</h1>
<div class="col-md-8 col-md-offset-2">
<a href="/reg/" class="btn btn-success">添加數據</a>
<table class="table-hover table table-bordered table-striped">
<thead>
<tr>
<th>id</th>
<th>username</th>
<th>password</th>
<th>功能</th>
</tr>
</thead>
<tobdy>
{% for foo in user_list %} {# user_list類似列表對象 #} #循環打印數據庫中獲取到的數據
<tr>
<td>{{ foo.pk }}</td> #pk顯示的是數據庫的主鍵
<td>{{ foo.username }}</td>
<td>{{ foo.password }}</td>
<td>
<a href="/edit/?edit_id={{ foo.pk }}" class="btn btn-success">編輯</a> #定義一個編輯模塊,設置一個把參數通過get連接的方式傳遞,
#定義一個刪除模塊,設置一個把參數通過get連接的方式傳遞,
<a href="/delete_user/?delete_id={{ foo.pk }} " class="btn btn-danger">刪除</a>
</td> </tr> {% endfor %} </tobdy> </table> </div> </div> </div> </body> </html>
四、新增數據:
# views.py
def reg(request): if request.method == 'POST': username=request.POST.get('username') password=request.POST.get('password') # 操作數據庫插入數據 #方式一 # user_obj=models.User.objects.create(username=username,password=password) user_obj=models.User(username=username,password=password) user_obj.save() # 調用save方法保存數據到數據庫 print(user_obj.pk) # 獲取主鍵值 print(user_obj.username) # 獲取用戶賬號 print(user_obj.password) # 獲取密碼 # return HttpResponse('注冊成功') return redirect('/userlist/') return render(request,'reg.html')
<! reg.html>
<!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>
<scrip src="/static/bootstrap-3.3.7/js/bootstrap.min.js"></scrip>
<link rel="stylesheet" href="/static/bootstrap-3.3.7/css/bootstrap.min.css">
</head>
<body>
<div class="container">
<div class="row">
<h1>注冊頁面</h1>
<div class="col-md-8 col-md-offset-2">
<form action="" method="post">
<p>用戶名:<input type="text" class="form-control" name="username"></p>
<p>密碼:<input type="password" class="form-control" name="password"></p>
<input type="submit" class="btn btn-success">
</form>
</div>
</div>
</div>
</body>
</html>
五、刪除數據功能:
def delete_user(request):
delete_id=request.GET.get('delete_id')
# res=models.User.objects.filter(id=delete_id).first() #查看首條數據
models.User.objects.filter(id=delete_id).delete() # 刪除數據
return redirect('/userlist/')
return HttpResponse('刪除')
=====================================================
# models.User.objects.filter(id=1).delete() # 會將queryset所有的數據對象全部刪除
六、編輯數據,在編輯模塊中需要用到之前數據中的主鍵,通過查看數據頁面中編輯按鈕,把主鍵參數傳遞過來
def edit(request):
#判斷請求模式
if request.method == 'POST':
print(request.POST)
username=request.POST.get('username')
password=request.POST.get('password')
edit_id=request.POST.get('edit_id') #這里的id主鍵通過查看數據頁面中編輯按鈕傳遞過來
# 更新數據庫
models.User.objects.filter(id=edit_id).update(username=username,password=password)
return redirect('/userlist/') #更新完成后重定向頁面到查看列表頁面
# 獲取用戶想要修改的用戶id
edit_id = request.GET.get('edit_id')
# 將該數據查詢出來進行渲染
# 查案數據方式一
user_query=models.User.objects.filter(id=edit_id).first()
# 查詢數據方式2
# user_obj=models.User.objects.get(id=edit_id)
# print(user_obj,type(user_obj))
# 將當前數據渲染到頁面上去
return render(request,'edit.html',locals())
========================================================================
#以下僅為介紹:
編輯對象的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()
=======================================================================
<!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>
<script src="https://cdn.bootcss.com/twitter-bootstrap/3.4.1/js/bootstrap.min.js"></script>
<link href="https://cdn.bootcss.com/twitter-bootstrap/3.4.1/css/bootstrap.min.css" rel="stylesheet">
</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_query.pk }}">
<p>username:<input type="text" name="username" value="{{ user_query.username }}" class="form-control"></p>
<p>password:<input type="text" name="password" value="{{ user_query.password }}" class="form-control"></p>
<input type="submit" class="btn btn-success">
</form>
</div>
</div>
</div>
</body>
</html>
