此處附上連接地址:http://www.javashuo.com/article/p-gvqrurmt-bu.html
(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')
上面兩個操做,都必須依仗 --> 查詢數據
查詢數據涉及到對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
在原先個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())
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>