Skip to content
On this page

Example Django CRUD

建立操作資料庫流程 :

  1. 建立資料表 (model.py)
  2. 建立前端頁面 (.html)
  3. 建立處理函式 (views.py)
  4. 建立子路由 (urls.py)

建立資料表 (model.py)

規劃表單、欄位

py
class Item(models.Model):
    description= models.TextField(max_length=500, null=True)

建立前端頁面 (html)

將欄位視覺化,對應2個重點,一個是urls.py內的子路由 (path),另一個則是views.py內的函式 (def method function)

html
<form method="POST" action="{% url 'add_item' %}">
    ...
</form>

<div>
    {% for i in item_list %}
        <a href="{% url 'edit_item' i.id %}"> 編輯 </a>
        <a href="{% url 'delete_item' i.id %}"> 刪除 </a>
    {% endfor %}
</div>

<a href="{% url 'add_item' %}"> 新增 </a>

提醒

上述使用jinaj的 html 寫法,採列表渲染 {% for %}、{% endfor %},與 vue.js 類似寫法。

建立處理函式 (views.py)

對應資料表欄位,進行處理,一開始需要先載入資料表。

py
from .models import Item
# or
from .models import *
# or
import .models
  1. 新增/創建 Add/Create

當創建新資料時需要確認方法與資料的正確性,所以需要採用if來判斷。

py
def add_item(request):
    # 判斷前端丟過來的方法
  if request.methods=="POST":
    # 取用前端欄位
    item_1=request.POST['item_1']
    item_2=request.POST['item_2']
    # 對應資料表欄位
    all_item = Mytable(name=item_1, descripts=item_2)
    # 判斷資料正確性(是否為空白)
    if item_1 or item_2 != "":
         # 儲存
          all_item.save()
         # 回應前端
         message.info(request, '儲存完成')
    else:
        message.info(request, '儲存資料有誤')
        # 略過資料
        pass
    # 返回讀取畫面
    return redirect(read)

提醒

記得用POST,記得要儲存 save()

  1. 讀取 Read (with MySQL and Multipe Database Connect)

把資料表內容提取出來,然後使用陣列方式顯示。

py
def read_item(request):
    # 提取資料表
    item_list=Mytable.objects.all()
    # 將資料陣列
    contex={'item_list':item_list} 
    # 回傳contex資料
    return render(request, index.html, contex)

使用 django.dbconnection 連接 MySQL 的方法:

py
from django.db import connection
def read_item(request):
    result=connection.cursor()
    result.execute('SELECT * FROM dbname')
    return render( request, 'show.html', {
        "msg": result.fetchall(),
        "datainfo" : result.description,
    })

TIP

如果有2個以上的資料庫連線,則需要使用到connections,舉例:

py
from django.db import connections
def read_items(request):
    result=connections['第2個資料庫'].cursor()
    ...

Django官方 : Executing custom SQL directly

  1. 編輯/更新 Update/Patch

需要前端提供id,才不會修改錯筆資料。

py
def update_item(request, myid):
  1. 刪除 Delete

需要前端提供id,才能對應相對資料進行刪除。

py
def delete_item(request, myid):
    # 先找到id
    del_item=Mytable.object.get(id=myid)
    # 進行刪除
    del_item.delete()
    # 回應前端
  1. DataSet / DataClasses 結構方式 敘述資料的處理採用 CLASS 打包,可以讓處理個過程更容易擴充、更有彈性,不過初步要考量諸多因素:。
    • 5-1 Query 選擇
    • 5-2 Update 更新
    • 5-3 Row Count 總數統計
    • 5-4 Get Value 取得內值
    • 5-5 ColumnSet 欄位打包
    • 5-6 ResultSet 結果打包
    • 5-7 Begin 儲存過程(進階)
    • 5-8 Commit 儲存/交提(mysql進階)
    • 5-9 Rollback 錯誤時回傳前次資料狀態(進階)

以下先舉例 READ/GET 的用法

py
# 建立新的 util.py
# 先引入db連結
from django.db import connection
py
# 建立打包名稱
class DataSet:
    # 將資料、連結、除錯都預設為空值或False
    dbconn=None
    debug=False
    column=None
    results=None

    # 先定義連結與除錯項目
    def __init__(self,debut:bool)->None:
        self.dbconn=connection
        self.debut=debug

    def query(self, sql:str, *args)->None:
        if no sql.strap().upper().startswith('SELECT'):

建立子路由 (urls.py)

建議子路由需對應 views 處理函式

py
from django.url import path

urlpatterns=[
    path("add/", views.add_item, name="add item"),
    path("", views.read_item, name="read item"),
    path("update/", views.update_item, name="update item"),
    path("delete/", views.delete_item, name="delete item"),
]

建構中