通過django搭建一個簡易的web頁面(實現數據的查詢、添加、修改、刪除)


 

一、創建django項目

  通過命令創建:

  django-admin startproject 項目名稱

  創建app應用

  python3 manage.py startapp 應用名    #這里manage.py是創建完成django項目后產生的文件

  到此步基礎的創建完成,

  把新增的app應用添加到配置文件中去

  命令行創建django項目沒有templates文件夾,這個文件夾是存放html文件的

  手動創建一個templates文件夾,把這個文件夾添加到配置文件中去

  到這里就可以啟動django項目了

 

准備:

  1、需要提前創建好數據庫,設置好表格字段,遷移生成數據庫表(ORM)

   1.1、修改現有數據庫連接方式,修改settings文件: 

DATABASES = {
    'default': {
        'ENGINE': 'django.db.backends.mysql',
        'NAME': 'book_system',
        'HOST': '192.168.100.100',
        'PORT': '3306',
        'USER': 'root',
        'PASSWORD': 'root'
    }
}

 

   1.2、在__init__.py文件中添加: 

import pymysql
pymysql.install_as_MySQLdb()

   1.3、在app應用目錄中的models.py文件中添加生成數據庫表格字段的語句內容:

from django.db import models

# Create your models here.
class User(models.Model):
    id=models.AutoField(primary_key=True)
    # 定義varchar字段
    username=models.CharField(max_length=32)
    password=models.CharField(max_length=32)
        
    def __str__(self):
    return self.username

  1.4、數據庫遷移

#執行命令,將數據庫中的變動記錄到一個文件中去
python3 manage.py makemigrations
# 將數據庫變動同步到數據庫中
python3 manage.py migrate

  1.4.1、記錄數據庫中變動記錄的文件:

  1.5、查看數據庫中表是否創建完成,字段是否正確:

  

  2.1、設置靜態文件

    html頁面引入外部資源的兩種方式

      通過cdn方式在線獲取

      使用本地static目錄中存放的外部資源

    創建一個static文件夾,把bootstrap程序放到次目錄中去,也可以不放,使用cdn在線獲取

    

靜態文件配置
STATIC_URL = '/static/'
# 靜態文件配置
STATICFILES_DIRS = [
    os.path.join(BASE_DIR,'static')
]
# 暴露給外界能夠訪問服務器靜態文件夾下面所有的資源


STATIC_URL = '/xxx/'  # 接口前綴 跟你的靜態文件夾的名字一點關系都沒有
# 默認情況下這個前綴跟靜態文件夾名字一樣!!!
# 靜態文件配置
STATICFILES_DIRS = [
    os.path.join(BASE_DIR,'static'),  # 就是你的靜態文件夾路徑
    os.path.join(BASE_DIR,'static1'),
    os.path.join(BASE_DIR,'static2')
]
# ps:會依次查找列表中所有的靜態文件路徑 找到的話立刻停止,都沒有找到返回404

  

二、通過django做一個登錄功能

   views文件加入模塊

  HttpResponse:返回字符串
  render:返回html並且支持模板渲染
  redirect:重定向
    既可以重定向到別人的網址也可以定向到自己的

   

   1.1、設置urls路徑:    

  url(r'^login/', views.login),
  1.2、根據路徑需要在哎views.py文件中創建login函數
def login(request):
    if request.method=='POST':
        username = request.POST.get('username')  # 獲取前台提交的用戶
        password = request.POST.get('password')  # 獲取前台提交的密碼
        user_list=models.User.objects.filter(username=username,password=password).first()
        print(user_list)
        if user_list:
            return HttpResponse('登錄成功')
    return render(request, 'login.html')
======================================================================================================
下面這些是介紹:
def login(request):
print(request.method) # 查看用戶獲取的請求方式是get還是post請求
if request.method == 'POST':
username = request.POST.get('username') # 獲取前台提交的用戶
password = request.POST.get('password') # 獲取前台提交的密碼
conn = pymysql.connect(
host='192.168.100.100',
port=3306,
user='root',
password='root',
database='book_system',
charset='utf8',
autocommit=True
)
cursor = conn.cursor(pymysql.cursors.DictCursor)
cursor.execute('select * from userinfo where username=%s and password=%s',(username, password))
user_info = cursor.fetchall()
if user_info:
return HttpResponse('登錄成功')
return render(request,'login.html')
# if request.method == 'GET':
# return render(request, 'login.html')
# # get請求傳遞值獲取和post方式一樣,單個用get,多個用getlist
# elif request.method == 'POST':
# <QueryDict: {'username': ['test1', 'test2', 'test3'], 'password': ['1111111111111']}>
# print(request.POST)
# print(request.POST.get('username')) # 只會獲取最后一個值test3
# print('=======================')
# print(request.POST.getlist('username')) # 全部獲取列表的形式展示出來['test1', 'test2', 'test3']
===========================================================================================================








   

 

  這里需要調用到login.html文件,在templates中設置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>
    <scrip src="/static/bootstrap-3.3.7/js/bootstrap.min.js"></scrip>
    <link rel="stylesheet" href="/static/bootstrap-3.3.7/css/bootstrap.min.css">
</head>
<body>
<div class="container">
    <div class="row">
        <h1>登錄頁面</h1>
        <div class="col-md-6 col-md-offset-3">
            <form action="" method="post">  {# from表單默認是get請求,修改為post請求}
                <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" class="btn btn-success">
            </form>
        </div>
    </div>
</div>
</body>
</html>

  form表單觸發提交數據的動動作兩種方式:

<input type="submit">
<button></button>  
  form提交數據的地址如何指定及方式?
action屬性控制提交的地址
方式:
1.全路徑
<form action="http://127.0.0.1:8000/login/">
2.只寫路徑后綴
<form action="/login/">
3.不寫 (默認往當前路徑提交)
form表單默認是get請求

三、查看數據
def userlist(request):
    # 獲取數據庫用戶數據
    user_list=models.User.objects.all()  #獲取數據庫中所有數據
    # print(user_list.query)  # 只要是queryset對象就可以獲取當前queryset對象的語句
    # for user_obj in user_list:
    #     print(user_obj.pk,user_obj.username)
    return render(request,'userlist.html',locals())    #locals() 把本地的參數傳遞過去
 
        
<!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>
    <script src="https://cdn.bootcss.com/twitter-bootstrap/3.4.1/js/bootstrap.min.js"></script>
    <link href="https://cdn.bootcss.com/twitter-bootstrap/3.4.1/css/bootstrap.min.css" rel="stylesheet">
</head>
<body>
<div class="container">
    <div class="row">
    <h1>數據展示</h1>

        <div class="col-md-8 col-md-offset-2">
        <a href="/reg/" class="btn btn-success">添加數據</a>
            <table class="table-hover table table-bordered table-striped">
                <thead>
                    <tr>
                        <th>id</th>
                        <th>username</th>
                        <th>password</th>
                        <th>功能</th>
                    </tr>
                </thead>
                <tobdy>
                    {% for foo in user_list %} {# user_list類似列表對象 #}  #循環打印數據庫中獲取到的數據
                        <tr>
                            <td>{{ foo.pk }}</td>  #pk顯示的是數據庫的主鍵
                            <td>{{ foo.username }}</td>
                            <td>{{ foo.password }}</td>
                            <td>
                                <a href="/edit/?edit_id={{ foo.pk }}" class="btn btn-success">編輯</a>  #定義一個編輯模塊,設置一個把參數通過get連接的方式傳遞,
                    #定義一個刪除模塊,設置一個把參數通過get連接的方式傳遞,
                   <a href="/delete_user/?delete_id={{ foo.pk }} " class="btn btn-danger">刪除</a>
 
         
</td> </tr> {% endfor %} </tobdy> </table> </div> </div> </div> </body> </html>

  

四、新增數據:
# views.py

def reg(request): if request.method == 'POST': username=request.POST.get('username') password=request.POST.get('password') # 操作數據庫插入數據 #方式一 # user_obj=models.User.objects.create(username=username,password=password) user_obj=models.User(username=username,password=password) user_obj.save() # 調用save方法保存數據到數據庫 print(user_obj.pk) # 獲取主鍵值 print(user_obj.username) # 獲取用戶賬號 print(user_obj.password) # 獲取密碼 # return HttpResponse('注冊成功') return redirect('/userlist/') return render(request,'reg.html')

  

<! reg.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>
    <scrip src="/static/bootstrap-3.3.7/js/bootstrap.min.js"></scrip>
    <link rel="stylesheet" href="/static/bootstrap-3.3.7/css/bootstrap.min.css">
</head>
<body>

<div class="container">
    <div class="row">
        <h1>注冊頁面</h1>
        <div class="col-md-8 col-md-offset-2">
            <form action="" method="post">
                <p>用戶名:<input type="text" class="form-control" name="username"></p>
                <p>密碼:<input type="password" class="form-control" name="password"></p>
                <input type="submit" class="btn btn-success">
            </form>
        </div>
    </div>
</div>

</body>
</html>

五、刪除數據功能:
def delete_user(request):
    delete_id=request.GET.get('delete_id')
    # res=models.User.objects.filter(id=delete_id).first()    #查看首條數據
    models.User.objects.filter(id=delete_id).delete()   # 刪除數據
    return redirect('/userlist/')
    return HttpResponse('刪除')

=====================================================
# models.User.objects.filter(id=1).delete()  # 會將queryset所有的數據對象全部刪除
 
        

六、編輯數據,在編輯模塊中需要用到之前數據中的主鍵,通過查看數據頁面中編輯按鈕,把主鍵參數傳遞過來

  

def edit(request):
    #判斷請求模式
    if request.method == 'POST':
        print(request.POST)
        username=request.POST.get('username')
        password=request.POST.get('password')
        edit_id=request.POST.get('edit_id')  #這里的id主鍵通過查看數據頁面中編輯按鈕傳遞過來
        # 更新數據庫
        models.User.objects.filter(id=edit_id).update(username=username,password=password)
        return redirect('/userlist/')  #更新完成后重定向頁面到查看列表頁面
    # 獲取用戶想要修改的用戶id
    edit_id = request.GET.get('edit_id')
    # 將該數據查詢出來進行渲染
    # 查案數據方式一
    user_query=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的獲取方式
方式1:利用input隱藏一個標簽
<input type="hidden" name="edit_id" value="{{ user_obj.pk }}">
方式2:
<form action="/edit/?edit_id={{ user_obj.pk }}" method="post">

注意:queryset對象點修改 刪除 會作用於對象內部所有的數據對象 類似於批量操作
方式1:
models.User.objects.filter(id=edit_id).update(name=username,password=password)
方式2:獲取到當前數據對象
user_obj = models.User.objects.filter(id=edit_id).first()
user_obj.name = username
user_obj.save()
=======================================================================

  

<!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>
    <script src="https://cdn.bootcss.com/twitter-bootstrap/3.4.1/js/bootstrap.min.js"></script>
    <link href="https://cdn.bootcss.com/twitter-bootstrap/3.4.1/css/bootstrap.min.css" rel="stylesheet">
</head>
<body>
<div class="container">
    <div class="row">
        <h1>刪除數據</h1>
        <div class="col-md-6 col-md-offset-3">
            <form action="" method="post">
                <input type="hidden" name="edit_id" value="{{ user_query.pk }}">
                <p>username:<input type="text" name="username" value="{{ user_query.username }}" class="form-control"></p>
                <p>password:<input type="text" name="password" value="{{ user_query.password }}" class="form-control"></p>
                <input type="submit" class="btn btn-success">
            </form>
            
        </div>
    </div>

</div>
</body>
</html>

  




免責聲明!

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



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