返回主目錄:Django框架
內容目錄:
1.pycharm連接數據庫及相應操作
2.手擼登錄注冊編輯刪除
3.完整代碼
一、pycharm連接數據庫及相應操作
此處附上鏈接地址:https://www.cnblogs.com/xt12321/p/10992542.html
二、手擼登錄注冊編輯刪除
2.1 登錄、注冊
(1)登錄 1> 先在urls.py里面添加路由設置 2> 再在視圖層 view.py里面定義login的處理邏輯 3> 在templates文件夾里面,添加上login.html文件 這樣三步下來之后,便可以在本機上訪問本地的登錄界面 urls.py文件 --> urlpatterns中添加路由: url(r'^login/', views.login), views.py文件 --> 處理路由邏輯 # 如果請求方式是POST 表示是請求登錄的操作 # 先去數據庫拿數據,再匹配密碼是否正確, # 不正確則進行提示,並返回登錄頁,正確則進入圖書列表界面 # 如果請求方式是GET,那么則直接返回登錄界面回去就可以了 ps:有一個問題就是: 當導入的js文件就是服務器本地的文件的時候,會報錯, 需要在settings.py里面設置STATICFILES_DIRS STATICFILES_DIRS = [ os.path.join(BASE_DIR, 'static'), ]
(2) 注冊 邏輯與登錄類似,只是在返回頁面的時候改成reg.html 1> 用戶打開注冊頁面,服務端返回一個reg.html頁面 2> 用戶提交注冊信息,服務端處理注冊操作,返回相應結果 3> templates文件夾中同樣得有reg.html文件 ps: <1>當將form表單的提交方式改為post時,由於未配置csrf中間件,會報403錯誤 此時只要將settings.py文件中的MIDDLEWARE列表中的csrf注釋掉就行 <2> 注冊提交的數據格式: <QueryDict: {'username': ['lisi'], 'password': ['123']}> 通常取值方式有: 1> 通過request.POST.get(key) 取值 --> 取出單個的元素 2> 通過request.POST['password'] 取值 --> 不推薦,會報錯 通過get方法去除的值是單個的(列表最后一個元素),如果列表中的數據為多個值的時候; 通過使用 getlist 方法,便可以取出列表中所有的值,常用於:多選框 <3> 獲取get請求的數據,與操作post一毛一樣!!

def login(request): # 如果請求方式是POST 表示是請求登錄的操作 # 先去數據庫拿數據,再匹配密碼是否正確, # 不正確則進行提示,並返回登錄頁,正確則進入圖書列表界面 # 如果請求方式是GET,那么則直接返回登錄界面回去就可以了 if request.method == 'POST': # username = request.POST.get('username') # password = request.POST.get('password') user_list = models.User.objects.all() print(user_list) for item in user_list: print(item, type(item), item.id, item.pk, item.name, item.password) return render(request, 'login.html')

def reg(request): if request.method == 'POST': username = request.POST.get('username') password = request.POST.get('password') print(username, password) print(request.POST) user_obj = models.User(name=username, password=password,) user_obj.save() return redirect('/list/') return render(request, 'reg.html')
2.2 ORM簡單操作
上面兩個操作,都必須依仗 --> 查詢數據
查詢數據涉及到對Django的ORM進行操作
2.2.1 修改Django數據庫模塊 <1> 首先先去settings.py中,修改DATA_BASES 字典文件 'ENGINE': 'django.db.backends.mysql', 'NAME': 'day55', 'HOST': '127.0.0.1', 'PORT': 3306, 'USER': 'root', 'PASSWORD': '123456', 修改engine,name,host,port,user,password這些內容,且key都為大寫 <2> 修改__init__.py文件,告訴Django使用pymysql(替換默認的mysql_db模塊) (mysql_db模塊性能不OK) 方式一:在項目文件夾下面的__init__.py文件中修改 方式二:在應用文件夾下面的__init__.py文件中修改 代碼: import pymysql pymysql.install_as_MySQLdb()
2.2.2 進行ORM操作 <1> 在應用的 models.py 文件中寫映射關系 代碼: class User(models.Model): # 設置id為主鍵,其中AutoFiled為自動遞增 id = models.AutoField(primary_key=True) # varchar(32) name字段 # ps: CharField在定義時,必須加max_length name = models.CharField(max_length=32) # varchar(16) password = models.CharField(max_length=20) <2> 將命令生效 --> 提交至數據庫執行 數據庫前移命令 方式一: 在pycharm的命令行(terminal)中 python manage.py makemigrations python manage.py migrate 方式二: 在Tools下的manage.py Task內進行操作 在這操作的好處就是,可以省不少代碼,只需要寫上makemigrations migrate 就可以,並且還有提示信息,自動補全,簡直不要太爽
2.2.3 查詢數據 (1) user_list = models.User.objects.all() # 查詢結果:(在models里面自定義了__str__方法) <QuerySet [<User: lisi>]> # 里面的每一個value都是 <class 'app01.models.User'> (2) user_obj = models.User.objects.get(id=user_id) 不推薦該方法,在數據庫中數據不存在時,會報錯,拿到的數據是對象 class對象,如<QuerySet [<User: lisi>]>中的lisi,不需要.first()取出數據

class User(models.Model): # 設置id為主鍵,其中AutoFiled為自動遞增 id = models.AutoField(primary_key=True) # varchar(32) name字段 # ps: CharField在定義時,必須加max_length name = models.CharField(max_length=32) # varchar(16) password = models.CharField(max_length=20) def __str__(self): return self.name
2.3 編輯、刪除
在原先個userlist.html中的action處,有兩個按鈕,一個是編輯,一個是刪除,
只需要對其button綁定相應的處理邏輯即可進行相應的事件操作
2.3.1 刪除 <1> 在userlist.html頁面中,點擊刪除按鈕,傳到后端唯一的一個pk, 通過數據庫操作,將數據刪除,並返回到userlist.html頁面 在有查詢數據的基礎之后,進行刪除操作操作就相對簡單很多,具體見代碼: 2.3.2 編輯 <1> 在userlist.html頁面中,點擊編輯按鈕,跳轉到edit.html頁面, <2> 這種情況下,必須在點擊的時候將目標用戶的pk傳到后端,后端操作數據庫, 再將數據渲染到前端頁面,並顯示給用戶 <3> 在用戶修改信息之后,再次提交給后端,后端對數據庫進行修改操作,成功之后, 將前端頁面數據渲染返回給前端顯示 在這兩種情況之中,需要將用戶的唯一標識pk傳到后端,其方法可以分為兩種: 方式一:利用input隱藏一個標簽 --> 我用的就是這個 方式二:可以在form標簽中的action后面添加'/edit/?edit-id={{user_obj.pk}}' 在后端,通過request.GET.get('edit_id')就可以接收提交的數據(注意,哪怕是form表單的提交方式是POST,只要是在URL中添加的數據,都是用GET方式取值)

def delete_user(request): user_id = request.GET.get('delete_id') models.User.objects.filter(id=user_id).delete() return redirect('/userlist/')

def edit(request): if request.method == 'POST': user_id = request.POST.get('edit_id') user_name = request.POST.get('username') user_password = request.POST.get('password') models.User.objects.filter(id=user_id).update(id=user_id, name=user_name, password=user_password) # user_obj = models.User.objects.filter(id=user_id).first() # user_obj.name = user_name # user_obj.password = user_password # user_obj.save() return redirect('/userlist/') pk = request.GET.get('edit_id') user_info = models.User.objects.filter(id=pk) # user_info = models.User.objects.get(id=pk) # 不推薦,當數據不存在的時候,會報錯 user_obj = user_info.first() return render(request, 'edit.html', locals())
3.完整代碼
python: 3.5 pycharm: 2018 Django: 1.11.11 Mysql: 5.7

"""day55 URL Configuration The `urlpatterns` list routes URLs to views. For more information please see: https://docs.djangoproject.com/en/1.11/topics/http/urls/ Examples: Function views 1. Add an import: from my_app import views 2. Add a URL to urlpatterns: url(r'^$', views.home, name='home') Class-based views 1. Add an import: from other_app.views import Home 2. Add a URL to urlpatterns: url(r'^$', Home.as_view(), name='home') Including another URLconf 1. Import the include() function: from django.conf.urls import url, include 2. Add a URL to urlpatterns: url(r'^blog/', include('blog.urls')) """ from django.conf.urls import url from django.contrib import admin from app01 import views urlpatterns = [ url(r'^/', views.index), url(r'^admin/', admin.site.urls), url(r'^reg/', views.reg), url(r'^login/', views.login), url(r'^userlist/', views.user_list), url(r'^edit/', views.edit), url(r'^delete/', views.delete_user), ]

from django.shortcuts import render, HttpResponse, redirect from app01 import models # Create your views here. def index(request): return redirect('/login') def reg(request): if request.method == 'POST': username = request.POST.get('username') password = request.POST.get('password') print(username, password) print(request.POST) user_obj = models.User(name=username, password=password,) user_obj.save() return redirect('/list/') return render(request, 'reg.html') def login(request): # 如果請求方式是POST 表示是請求登錄的操作 # 先去數據庫拿數據,再匹配密碼是否正確, # 不正確則進行提示,並返回登錄頁,正確則進入圖書列表界面 # 如果請求方式是GET,那么則直接返回登錄界面回去就可以了 if request.method == 'POST': # username = request.POST.get('username') # password = request.POST.get('password') user_list = models.User.objects.all() print(user_list) for item in user_list: print(item, type(item), item.id, item.pk, item.name, item.password) return render(request, 'login.html') def user_list(request): userlist = models.User.objects.all() # print(userlist.query) # for user_obj in userlist: # print(user_obj.pk, user_obj.name, user_obj.password) # print(type(user_obj.pk), type(user_obj.name), type(user_obj.password)) # print("1122233", userlist) return render(request, 'userlist.html', locals()) def delete_user(request): user_id = request.GET.get('delete_id') models.User.objects.filter(id=user_id).delete() return redirect('/userlist/') def edit(request): if request.method == 'POST': user_id = request.POST.get('edit_id') user_name = request.POST.get('username') user_password = request.POST.get('password') models.User.objects.filter(id=user_id).update(id=user_id, name=user_name, password=user_password) # user_obj = models.User.objects.filter(id=user_id).first() # user_obj.name = user_name # user_obj.password = user_password # user_obj.save() return redirect('/userlist/') pk = request.GET.get('edit_id') user_info = models.User.objects.filter(id=pk) # user_info = models.User.objects.get(id=pk) # 不推薦,當數據不存在的時候,會報錯 user_obj = user_info.first() return render(request, 'edit.html', locals()) # if __name__ == '__main__': # userlist(1)

MIDDLEWARE = [ 'django.middleware.security.SecurityMiddleware', 'django.contrib.sessions.middleware.SessionMiddleware', 'django.middleware.common.CommonMiddleware', # 'django.middleware.csrf.CsrfViewMiddleware', 'django.contrib.auth.middleware.AuthenticationMiddleware', 'django.contrib.messages.middleware.MessageMiddleware', 'django.middleware.clickjacking.XFrameOptionsMiddleware', ] TEMPLATES = [ { 'BACKEND': 'django.template.backends.django.DjangoTemplates', 'DIRS': [os.path.join(BASE_DIR, 'templates')], 'APP_DIRS': True, 'OPTIONS': { 'context_processors': [ 'django.template.context_processors.debug', 'django.template.context_processors.request', 'django.contrib.auth.context_processors.auth', 'django.contrib.messages.context_processors.messages', ], }, }, ] STATIC_URL = '/static/' # 接口前綴,默認情況下與靜態文件夾的名字一樣, # 可以不一樣,但是網頁的js地址同樣要保持一致, STATICFILES_DIRS = [ os.path.join(BASE_DIR, 'static'), ]

import pymysql pymysql.install_as_MySQLdb() # 告訴Django用pymysql代替mysql_db連接db

<!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/css/bootstrap.min.css"> <script src="/static/bootstrap-3.3.7/js/bootstrap.min.js"></script> </head> <body> <div class="container"> <h1> 用戶列表 </h1> <div class="row"> <div class="col-md-8 col-md-offset-2"> <a href="/reg/" class="btn btn-success">添加數據</a> <table class="table table-striped table-bordered table-hover"> <thead> <tr> <th class="text-center">id</th> <th class="text-center">name</th> <th class="text-center">password</th> <th class="text-center">action</th> </tr> </thead> <tbody> {% for user_obj in userlist %} <tr> <td class="text-center">{{ user_obj.pk }}</td> <td class="text-center">{{ user_obj.name }}</td> <td class="text-center">{{ user_obj.password }}</td> <td class="text-center"> <a href="/edit/?edit_id={{ user_obj.pk }}" class="btn btn-primary" >編輯</a> <a href="/delete/?delete_id={{ user_obj.pk }}" class="btn btn-danger">刪除</a> </td> </tr> {% endfor %} </tbody> </table> </div> </div> </div> </body> </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> <link rel="stylesheet" href="/static/bootstrap-3.3.7/css/bootstrap.min.css"> <script src="/static/bootstrap-3.3.7/js/bootstrap.min.js"></script> </head> <body> <div class="container"> <div class="row"> <div class="col-md-8 col-md-offset-2"> <h1>編輯頁面</h1> <form action="/edit/" 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-success" value="提交"> </form> </div> </div> </div> </body> </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> <link rel="stylesheet" href="/static/bootstrap-3.3.7/css/bootstrap.min.css"> <script src="/static/bootstrap-3.3.7/js/bootstrap.min.js"></script> </head> <body> <div class="container"> <div class="row"> <div class="col-md-6 col-md-offset-3"> <h1> 登錄界面 </h1> <form action="" method="post"> <p>username:<input type="text" name="username" class="form-control"></p> <p>password:<input type="password" name="password" class="form-control"></p> <input type="submit" class="btn btn-primary" value="登錄"> </form> </div> </div> </div> </body> </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> <link rel="stylesheet" href="/static/bootstrap-3.3.7/css/bootstrap.min.css"> <script src="/static/bootstrap-3.3.7/js/bootstrap.min.js"></script> </head> <body> <div class="container"> <div class="row"> <div class="col-md-6 col-md-offset-3"> <h1> 用戶注冊 </h1> <form action="" method="post"> <p>username:<input type="text" name="username" class="form-control"></p> <p>password:<input type="password" name="password" class="form-control"></p> <input type="submit" class="btn btn-primary" value="注冊"> </form> </div> </div> </div> </body> </html>