Django完成經常使用四大功能

返回主目錄:Django框架

內容目錄:

1.pycharm鏈接數據庫及相應操做

2.手擼登陸註冊編輯刪除

3.完整代碼

1、pycharm鏈接數據庫及相應操做

此處附上連接地址:http://www.javashuo.com/article/p-gvqrurmt-bu.html

2、手擼登陸註冊編輯刪除

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
相關文章
相關標籤/搜索