Django框架操作之實現登錄、注冊功能(數據庫的增、刪、改、查)


一、Django的工作流

1:用戶通過瀏覽器輸入相應的 URL 發起 HTTP 請求(一般是 GET/POST)

2:Django 接受到請求,檢測 urls.py 文件,找到和用戶輸入的 URL 相匹配的項,並調用該 URL 對應的視圖函數(view),例如,通常來說 urls.py 文件里的代碼是這樣的:

url(r'^homepage/$', views.home_page)

則當用戶輸入的 URL 為 www.某個網址.com/homepage 時,django 檢測到該 URL 與上面的代碼 匹配,於是調用后面的 views.home_page 視圖函數,把相應的請求交給該視圖函數處理。

3:視圖函數被調用后,可能會訪問數據庫(Model)去查詢用戶想要請求的數據,並加載模板文件(Template),渲染完數據后打包成 HttpResponse 返回給瀏覽器(Http協議)

二、准備工作

大致工作流程就是這樣,從流程可以看出,我們需要做的就是:

#准備工作,創建app
python3 manage.py startapp app01
#在配置文件(settings-->INSTALLED_APPS)中添加
INSTALLED_APPS = [
    'django.contrib.admin',
    'django.contrib.auth',
    'django.contrib.contenttypes',
    'django.contrib.sessions',
    'django.contrib.messages',
    'django.contrib.staticfiles',
    'app01.apps.App01Config',    #或者app01
]
創建APP,並添加到配置文件

三、編寫url、Http請求的視圖(view)函數

#1、編寫相應的 url(urls文件中)
from app01 import views
urlpatterns = [
    url(r'^admin/', admin.site.urls),
    url(r'^login/', views.login),
]

#2、編寫處理 Http 請求的視圖函數(View)
def login(request):
    pass            #功能代碼塊,暫用pass填充

四、搭建需要渲染的模板(template)

#3、編寫需要渲染的模板(template)

#3.1通常建立static文件夾放入靜態文件(bootstrap,js,css,image),然后在settings中配置路徑
STATIC_URL = '/static/'        #接口前綴,和靜態文件夾static無關
STATICFILES_DIRS = [
    os.path.join(BASE_DIR,'static')        #靜態文件夾路徑
]

#3.2登錄Html文件搭建
<body>
<div class="container">
    <div class="row">
        <h1>登錄頁面</h1>
        <div class="col-md-6 col-md-offset-3">
            #提交數據到后台使用form表單,action指定提交地址(3種方式)
            #1.全路徑 <form action="http://127.0.0.1:8080/login/">
            #2.只寫路徑后綴 <form action="/login/">
            #3.不寫,默認當前路徑(http://127.0.0.1:8080/login/)提交
            <form action="">  
                <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’> 或 <button></button>
                <input type="submit" class="btn btn-success">
            </form>
        </div>
    </div>
</div>
</body>

五、具體視圖函數功能實現

5.1登錄視圖測試

#4.1根據用戶請求類型,執行對應功能
'''
    由於form表單提交數據默認get請求,實際提交數據是POST請求,需要修改客戶端的請求類型(獲取客戶端請求類型:request.method)。
       通過<form action="" method="post">直接修改會報錯(403),還需注釋settings中
 MIDDLEWARE 的'django.middleware.csrf.CsrfViewMiddleware',
'''
def login(request):
    if request.method =='POST':
        return HttpResponse('OK')
    return render(request,'login.html')


#4.2獲取用戶數據(GET/POST請求獲取方式一致) ''' 嘗試打印 print(request.POST),可將其看做字典存放了post提交的數據。 字典中的value是列表結構,但取值時拿到的是單個元素; 獲取列表元素: request.POST.get('username');默認獲取列表最后一個元素。
        request.POST['username'];不推薦使用(鍵不存在直接報錯)
若字典中value有多個元素可使用(用戶愛好,多選框): request.POST.getlist('username');
''' def login(request): if request.method =='POST': print(request.POST) #可將其看做字典,存放了post提交的所有數據 #獲取列表數據,使用的username是根據前端<input...name="username"> name屬性 print(request.POST.get('username')) print(request.POST['username'] print(request.POST.getlist('username') #獲取列表中所有數據 return HttpResponse('OK') return render(request,'login.html')

5.2數據庫的連接和配置

#4.3連接數據庫
'''
使用PyCharm連接數據庫: DataBase-->DataSource-->下載驅動-->配置參數-->Test Connection Django連接數據庫配置(settings文件): 1.修改配置 DATABASES = { 'default': { 'ENGINE': 'django.db.backends.mysql', 'NAME': 'day55', 'HOST': '127.0.0.1', 'PORT': 3306, 'USER': 'root', 'PASSWORD': '51cwdqgcs',}} 2.用pymysql替換默認的mysql_db模塊連接數據庫 在項目文件夾或應用文件下__init__.py寫入 import pymysql pymysql.install_as_MySQLdb() '''

5.3 Django的ORM

class User(models.Model):        #在app01-->models中創建類繼承 models.Model
    id = models.AutoField(primary_key=True)     #添加相應字段
    name = models.CharField(max_length=32)    #CharField定義時必須指定max_length參數
    password = models.CharField(max_length=32)
再執行數據庫遷移命令              
'''
1.django的ORM不能自動創建庫(手動創建數據庫),但可以自動創建表。
2.
    python3 manage.py makemigrations 將數據庫變動記錄到migrations文件夾下
    python3 manage.py migrate 將數據庫變動同步到數據庫    
'''

5.4通過ORM實現數據庫的增、刪、改、查

#4.5通過測試Djang的ORM(增、刪、改、查)
#
def reg(request):
    if request.method=='POST':
        username = request.POST.get('username')
        password = request.POST.get('password')
        #操作數據庫user表插入數據
        #方法一
        #user_obj=models.User.objects.create(name=username,password=password)
        #方法二
         user_obj=models.User(name=username,password=password)
         user_obj.save()
        # print(user_obj)
        # print(user_obj.name)
        # print(user_obj.password)
        return HttpResponse('注冊成功')
    return render(request,'reg.html')
                          
 #增(完善):在數據展示頁面增加‘添加’數據按鈕
 #href屬性指定跳轉的頁面(注冊)
 <a href="/reg/" class="btn btn-success">添加數據</a>
#完成添加數據后,點擊按鈕重定向'數據展示'頁面
 return redirect('/userlist/')
添加數據
#
def userlist(request):
    user_list=models.User.objects.all() #獲取所有數據
    #user_list是QuerySst對象,點query獲取當前對象內部sql語句
    print(user_list.query)
     #循環打印用戶信息,放入html
    #for user_obj in user_list:
        #print(user_obj.password,user_obj.name)
        return render(request,'userlist.html',locals())
數據查詢
#定義修改視圖函數
def edit(request):
    if request.method == 'POST':
        print(request.POST)
        print(request.GET)
        username = request.POST.get('username')
        password = request.POST.get('password')
        # 獲取編輯對象的id方式
        edit_id = request.POST.get('edit_id')
        # 更新數據庫
        models.User.objects.filter(id=edit_id).update
              (name=username,password=password)
        #重定向'數據展示'  頁面
        return redirect('/userlist')
    # 獲取用戶想要修改的數據的id
    edit_id = request.GET.get('edit_id')
    # 將該數據查詢出來渲染到一個編輯頁面
    # 查詢數據方式1
    user_obj = 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(GET請求可以攜帶的參數就是在路徑后拼接)
 <a href="/delete_user/?delete_id={{ user_obj.pk }}" 
              class="btn btn-warning">刪除</a>
 #定義刪除視圖函數
 def delete_user(request):
    delete_id=request.GET.get('delete_id')
    # res_1 = models.User.objects.filter(id=delete_id)
    # print(res_1)  # QuerySet對象 <QuerySet [User:jason]>

    #QuerySet對象索引取值獲取數據對象
    # res = models.User.objects.filter(id=delete_id)[0]
    # res=models.User.objects.filter(id=delete_id).first()
    # print(res)  #數據對象,才能res.id取值

    #刪除queryset內所有數據對象
    res = models.User.objects.filter(id=delete_id).delete()
    return redirect('/userlist/')
刪除

 

 

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM