利用Django去操作數據庫並完成簡易的登錄及編輯功能


一、靜態文件

  什么是靜態文件?

    簡單來說靜態文件就是已經提前寫好了的,可以給網站使用的文件

    比如:

    css

    js

    第三方的一些組件:如bootstrap, sweetalter ,fontawesome等

  現在我們已經知道了網站所使用的HTML文件要存放到templates文件夾中,那么同理針對網站所使用

  到的靜態文件也用該單獨找喲個文件夾來存儲,這個文件夾默認情況下就都叫static

  該文件夾內部通常都是以下的結構

  static

    - css

      網站所使用的所有的css文件

    - js 

      網站所有用到的js文件

    - image

      網站所有用到的圖片的文件

    - 第三方文件

二、Django靜態文件配置

Django在配置文件中給你提供了配置文件的一些信息 我們只需要按照固定的寫法書寫

1、新建一個static文件

2、將我們新建好的靜態文件添加到配置文件中去

 3、添加好了靜態文件的配置以后我們就可以使用靜態文件的功能了(這里我用的是bootstrap的靜態文件)

基本配置:

STATIC_URL = '/static/'  # 這里的static是訪問后端靜態資源的接口前綴  默認情況下接口前綴名與靜態文件名保持一致
"""
<link rel="stylesheet" href="/xxx/bootstrap-3.3.7-dist/css/bootstrap.min.css">
你要想訪問后端的靜態資源 你必須以接口前綴開頭 后面跟上具體的文件路徑 才能夠訪問到對應的資源

當你的接口前綴正確之后 會拿着后面的路徑依次去下面列表中的每一個文件夾下查找對應的資源
順序是從上往下依次查找 如果都沒有找到才會報錯

STATICFILES_DIRS = [
os.path.join(BASE_DIR,'static'), # 這里的static才是你文件夾的路徑
os.path.join(BASE_DIR,'static1'),
os.path.join(BASE_DIR,'static2'),
]

解決動態綁定問題(*******)
{% load static %}
<link rel="stylesheet" href="{% static 'bootstrap-3.3.7-dist/css/bootstrap.min.css' %}">
<script src="{% static 'bootstrap-3.3.7-dist/js/bootstrap.min.js' %}"></script>

三、form表單

form表單默認是以get請求提交數據的
http://127.0.0.1:8000/login/?username=admin&password=123
action
1.不寫 默認朝當前地址提交數據
2.全路徑
3.后綴(/index)
提交post請求的時候 需要先去配置文件中注釋掉一行
如下圖將settings下的這一行注釋掉

視圖函數應該做到針對不同的請求 做出不同的處理邏輯
eg:
get請求來 應該只需要返回一個html文件
post請求來 應該獲取用戶提交的數據 然后做進一步處理
你必須要能夠判斷出當前請求到底是什么請求

四、request對象

獲取前端請求方式
request.method # 結果是一個純大寫的字符串 GET/POST

request.POST # 獲取post請求提交的數據 類似於是一個大字典
# <QueryDict: {'username': ['admin', 'jason'], 'password': ['123']}>
request.POST.get() # 只會取列表最后一個元素
request.POST.getlist() # 取出整個列表
request.GET # 獲取符合get請求攜帶數據格式的數據 url?xxx=yyy&ooo=lll
# <QueryDict: {'username': ['admin', 'jason'], 'password': ['123']}>
request.GET.get() # 只會取列表最后一個元素
request.GET.getlist() # 取出整個列表

通常情況下針對不同的請求應該做不同的處理 而一般情況下get請求次數要遠遠多於post請求
所以我們應該針對非get請求作出邏輯判斷 將get請求直接寫在函數體內而不做判斷

五、pycharm連接數據庫

1、准備工作:

將settings中默認的數據庫換成我們自己的數據庫

兩種方式

方式一:

 方式二:

 

 

六、Django連接數據庫(******)

需要你自己提前創建好對應的庫
·
1.先去配置文件中配置相關參數(注意default中的參數一定要全部大寫)
DATABASES = {
'default': {
'ENGINE': 'django.db.backends.mysql', # 數據庫類別
'NAME': 'day49', # 庫的名字
'HOST':'127.0.0.1',
'PORT':3306,
'USER':'root',
'PASSWORD':'123',
'CHARSET':'utf8'
}
}

2.在項目名或者應用名下面的__init__文件中告訴django使用pymysql鏈接數據庫而不是用默認的mysqldb
import pymysql
pymysql.install_as_MySQLdb()

七、Django  orm簡介

django orm不會幫你創建庫  只能幫你自動創建表
orm對象關系映射
類 表

對象 記錄

屬性 字段值
作用:能夠讓一個不會數據庫操作的小白也能夠通過Python面向對象語法 句點符來簡單快捷的操作數據

首先需要先去對應的應用下的models.py中書寫你的模型類
比如:
from django.db import models

# Create your models here.
class User(models.Model):
    # 等價於 id int primary_key auto_increment
    id = models.AutoField(primary_key=True)
    # 注:在Django中id可以不用自己創建 ,但如果主鍵名字不是id那就得自己創建了
    name = models.CharField(max_length=64)
    # 等價於 name varchar(64)  注意:這個max_length=一定要添加,不然會報錯
    # 並且CharField其實表示的StringField,這個名字和之前的orm有點不一樣

    password = models.CharField(max_length=32)


    def __str__(self):
        return self.name


class Book(models.Model):
    name = models.CharField(max_length=32)

注意(*********************一定要注意*********************):

(一、terminal命令行)

這里有個特別需要注意的點:一旦你修改了和數據庫內容相關的字段或字段值,一定要把下面兩行代碼加上

1、python manage.py makemigrations(這一步僅僅只是將你對數據庫的改動記錄到一個文件下這個文件就是migrations文件)

2、python manage.py migrate   # 這一步才是將改動過的數據真正的同步到數據庫中

注意: 上面的兩行命令永遠是成對出現的 只要你執行了1 那么就必須要執行2

*******只要你動了models.py跟數據相關的代碼 你就必須要重新執行上面的兩條命令來保證數據庫與models.py一致*******

(二、快捷鍵智能提示)

 

八、字段的增刪查改

字段的增
1.要么給該字段設置默認值
2.要么運行該字段可以為空
字段的查
...
字段的改
修改models代碼 之后執行數據庫遷移命令即可
字段的刪
只要注釋掉對應的字段 執行數據庫遷移命令就會將對應的字段及數據信息全部刪除(慎用)

例如:

九、數據庫的增刪查改


1.filter()
from app01 import models
res = models.User.objects.filter(username='jason') # select * from user where username='jason'
# 返回的結果是一個列表 支持索引取值但是不支持負數並且不推薦使用 推薦你使用它給你封裝好的方法
user_obj = res.first()
# filter方法條件不存在的時候 不會報錯返回的是一個空列表
"""
filter括號內直接放多個關鍵字參數 並且多個關鍵字參數之間是and關系
res = models.User.objects.filter(username='jason',password='123') # select * from user where username='jason' and password='123';
"""

2.查所有的數據
1.filter() 括號內不寫拿所有
<QuerySet [<User: jason>, <User: egon>, <User: sean>, <User: admin>, <User: 你不行>]>
2.all() 查詢所有數據
<QuerySet [<User: jason>, <User: egon>, <User: sean>, <User: admin>, <User: 你不行>]>

1.create()
user_obj = models.User.objects.create(name=username,password=password)
print(user_obj,user_obj.name)
# 該方法有返回值 返回值就是當前被創建的對象本身
2.對象的綁定方法
# 方式2
# 1 先生成一個User對象
user_obj = models.User(name=username,password=password)
# 2 調用對象的綁定方法
user_obj.save()


用戶點擊誰 你的后端就應該刪除
后端如何獲取用戶想要刪除的數據id?
models.User.objects.filter(id=delete_id).delete() # 將filter過濾出來的數據全部刪除 批量刪除


如何獲取用戶想要修改的數據id
根據數據id獲取數據並且展示到前端頁面供用戶查看

# 方式1(推薦) 批量更新
models.User.objects.filter(id=edit_id).update(name=username,password=password)
# 方式2(了解)
# 1 先獲取數據對象
edit_obj = models.User.objects.filter(id=edit_id).first()
# 2 再修改對象屬性
edit_obj.name = username
edit_obj.password = password
# 3 調用對象的綁定方法保存
edit_obj.save()
"""mylogin 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'^admin/', admin.site.urls),
    url(r'^login/', views.login),
    url(r'^reg/', views.reg),

    # 用戶展示頁
    url(r'^home/', views.home),
    # 刪除功能
    url(r'^delete_user/', views.del_user),
    # 編輯功能
    url(r'^edit_user/', views.edit_user)

]
urls.py
 
        
from django.shortcuts import render, HttpResponse, redirect
from app01 import models

# Create your views here.

def login(request):

    # 要給用戶返回一個登錄頁面
    '''為了減少代碼的層級:一般情況下視圖函數處理的get請求較多 所以可以直接在函數體內先寫get請求對應的邏輯
    再將其他請求利用request.method做出區分
    '''
    if request.method == 'POST':
        # 如何獲取數據(get和post)
        # print(request.GET)
        # print(request.POST) # 獲取post請求攜帶的數據 <QueryDict: {'username': ['admin'], 'password': ['123']}>你就把它當成是一個大字典即可

        # 獲取用戶的用戶名以及密碼
        # username = request.POST.get('username') # get只會默認取列表中的最后一個元素
        # password = request.POST.get('password')
        # print(username, type(username))  #yaya <class 'str'>
        # print(password, type(password))  #123 <class 'str'>

        # # 如果你想要直接拿到列表
        # username = request.POST.getlist('username')
        # print(username, type(username))  #['yaya'] <class 'list'>

        username = request.POST.get('username')
        password = request.POST.get('password')

        # 查詢數據庫
        res = models.User.objects.filter(name=username)  # 該方法返回的結果你可以看出是一個列表套數據對象的形式,filter相當於SQL語句的where
        # print(res)  #<QuerySet [<User: yafeng>]>
        # user_obj = res[0]  #QuerySet支持索引取值 但是不支持負數  並且雖然支持索引取值但是並不推薦你直接索引取值
        # user_obj = res.first()   # 推薦使用這種方式去獲取對象
        # print(user_obj.name, user_obj.password)

        if res:
            user_obj = res.first()
            if user_obj.password == password:
                return HttpResponse('登錄成功')
            else:
                return HttpResponse('密碼錯誤')
        return HttpResponse('用戶名不存在')

    # 獲取符合get請求攜帶參數特點的數據  url?xxx=xxx&yyy=yyy
    # print(request.GET)  # <QueryDict: {'username': ['admin'], 'password': ['123']}>
    # print(request.GET.get('username'),type(request.GET.get('username')))
    # print(request.GET.getlist('password'),type(request.GET.getlist('password')))

    return render(request, 'login.html')


def reg(request):
    if request.method == 'POST':
        username = request.POST.get('username')
        password = request.POST.get('password')

        # 直接超數據卡中添加數據
        # 方式一(推薦使用)
        user_obj = models.User.objects.create(name=username, password=password)
        print(user_obj, user_obj.name)
        #
        #  方式二
        # # 1、先生成一個use對象
        # user_obj = models.User(name=username, password=password)
        # # 2、調用對象的綁定方法
        # user_obj.save()

    return render(request, 'register.html')


def home(request):
    # 獲取user表中的所有數據
    res = models.User.objects.filter()   # 不給參數相當於查所有
    # print(res)

    user_queryset = models.User.objects.all()  #查所有數據

    return render(request, 'home.html', {'res': user_queryset})


def del_user(request):
    # 如何獲取用戶想要刪除的數據id
    delete_id = request.GET.get('delete_id')
    # 直接根據id刪除數據
    models.User.objects.filter(id=delete_id).delete()  # 將filter過濾出來的數據刪除
    # 重定向到展示頁
    return redirect('/home/')


def edit_user(request):
    # 獲取用戶想要修改的數據的id值
    edit_id = request.GET.get('edit_id')
    if request.method == 'POST':
        # 獲取用戶修改之后的用戶名與密碼
        username = request.POST.get('username')
        password = request.POST.get('password')

        # 修改數據
        # # 方式一(推薦)
        # models.User.objects.filter(id=edit_id).update(name=username, password=password)

        # 方式二
        # 1、先獲取數據對象
        edit_obj = models.User.objects.filter(id=edit_id).first()
        # 2、再修改對象的屬性
        edit_obj.name = username
        edit_obj.password = password
        # 3、調用對象的綁定方法保存
        edit_obj.save()
        # 再次跳轉到數據展示頁
        return redirect('/home/')
    # 根據id獲取數據對象 並且展示到html頁面上
    edit_obj = models.User.objects.filter(id=edit_id).first()

    return render(request, 'edit_user.html', {'edit_obj': edit_obj})
Views.py
from django.db import models

# Create your models here.
class User(models.Model):
    # 等價於 id int primary_key auto_increment
    id = models.AutoField(primary_key=True)
    # 注:在Django中id可以不用自己創建 ,但如果主鍵名字不是id那就得自己創建了
    name = models.CharField(max_length=64)
    # 等價於 name varchar(64)  注意:這個max_length=一定要添加,不然會報錯
    # 並且CharField其實表示的StringField,這個名字和之前的orm有點不一樣

    password = models.CharField(max_length=32)


    def __str__(self):
        return self.name


class Book(models.Model):
    name = models.CharField(max_length=32)
    # price = models.CharField(max_length=11)
models.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 href="https://cdn.bootcss.com/twitter-bootstrap/3.4.1/css/bootstrap.min.css" rel="stylesheet">#}
{#    <script src="https://cdn.bootcss.com/twitter-bootstrap/3.4.1/js/bootstrap.min.js"></script>#}
    {% load static %}
    <link rel="stylesheet" href="{% static 'bootstrap-3.3.7-dist/css/bootstrap.min.css' %}">
    <script src="{% static 'bootstrap-3.3.7-dist/js/bootstrap.min.js' %}"></script>

</head>
<body>
<div class="container">
    <div class="row">
        <div class="col-md-8 col-md-offset-2">
            <h2 class="text-center">登錄</h2>
            <form action="" method="post">  <!--將請求方式改成post-->
                <p>username:<input type="text" name="username" class="form-control"></p>
                <p>password:<input type="text" name="password" class="form-control"></p>
                <input type="submit" class="btn btn-success">
            </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 href="https://cdn.bootcss.com/twitter-bootstrap/3.4.1/css/bootstrap.min.css" rel="stylesheet">#}
{#    <script src="https://cdn.bootcss.com/twitter-bootstrap/3.4.1/js/bootstrap.min.js"></script>#}
    {% load static %}
    <link rel="stylesheet" href="{% static 'bootstrap-3.3.7-dist/css/bootstrap.min.css' %}">
    <script src="{% static 'bootstrap-3.3.7-dist/js/bootstrap.min.js' %}"></script>

</head>
<body>
<div class="container">
    <div class="row">
        <div class="col-md-8 col-md-offset-2">
            <h2 class="text-center">注冊</h2>
            <form action="" method="post">
                <p>username:<input type="text" name="username" class="form-control"></p>
                <p>password:<input type="text" name="password" class="form-control"></p>
                <input type="submit" class="btn btn-primary">
            </form>
        </div>
    </div>
</div>
</body>
</html>
register.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 href="https://cdn.bootcss.com/twitter-bootstrap/3.4.1/css/bootstrap.min.css" rel="stylesheet">#}
{#    <script src="https://cdn.bootcss.com/twitter-bootstrap/3.4.1/js/bootstrap.min.js"></script>#}
    {% load static %}
    <link rel="stylesheet" href="{% static 'bootstrap-3.3.7-dist/css/bootstrap.min.css' %}">
    <script src="{% static 'bootstrap-3.3.7-dist/js/bootstrap.min.js' %}"></script>

</head>
<body>
<div class="container">
    <div class="row">
        <div class="col-md-8 col-md-offset-2">
            <h2 class="text-center">編輯</h2>
            <form action="" method="post">  <!--將請求方式改成post-->
                <p>username:<input type="text" name="username" class="form-control" value="{{ edit_obj.name }}"></p>
                <p>password:<input type="text" name="password" class="form-control" value="{{ edit_obj.password }}"></p>
                <input type="submit" class="btn btn-warning pull-right">
            </form>
        </div>
    </div>
</div>
</body>
</html>
edit_user.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 href="https://cdn.bootcss.com/twitter-bootstrap/3.4.1/css/bootstrap.min.css" rel="stylesheet">#}
{#    <script src="https://cdn.bootcss.com/twitter-bootstrap/3.4.1/js/bootstrap.min.js"></script>#}
    {% load static %}
    <link rel="stylesheet" href="{% static 'bootstrap-3.3.7-dist/css/bootstrap.min.css' %}">
    <script src="{% static 'bootstrap-3.3.7-dist/js/bootstrap.min.js' %}"></script>

</head>
<body>
<div class="container">
    <div class="row">
        <div class="col-md-8 col-md-offset-2">
            <h1 class="text-center">數據展示</h1>
            <table class="table table-striped table-hover">
                <thead>
                    <tr>
                        <th>id</th>
                        <th>name</th>
                        <th>password</th>
                        <th>operation</th>
                    </tr>
                </thead>
                <tbody>
                    {% for user_obj in res %} <!--[user_obj1, user_obj2...]-->
                        <tr>
                            <td>{{ user_obj.id }}</td>
                            <td>{{ user_obj.name }}</td>
                            <td>{{ user_obj.password }}</td>
                            <td>
                                <a href="/edit_user/?edit_id={{ user_obj.id }}" class="btn btn-primary btn-xs">編輯</a>
                                <a href="/delete_user/?delete_id={{ user_obj.id }}" class="btn btn-danger btn-xs">刪除</a>
                                <!--這個是查找具有delete_user的路由然后到對應的視圖函數,並在請求的同時將用戶的數據一並提交-->
                            </td>
                        </tr>

                    {% endfor %}

                </tbody>
            </table>
        </div>
    </div>
</div>
</body>
</html>
home.html

效果圖:

 

 

 查詢數據:

 

 刪除:

 

 修改:

 

 增加:

 

 

 
 


免責聲明!

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



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