Django完成常用四大功能


返回主目錄: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')
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')
reg部分代碼
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
Django ORM操作
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/')
delete部分代碼
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())
edit部分代碼

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),

]
urls.py
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)
views.py
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'),
]
settings.py 只有修改的部分
import pymysql

pymysql.install_as_MySQLdb()  # 告訴Django用pymysql代替mysql_db連接db
項目的__init__.py部分
<!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>
userlist.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>
edit.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>
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>
    <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>
reg.html

 

 

 


免責聲明!

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



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