Example Django CRUD
建立操作資料庫流程 :
建立資料表 (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
- 新增/創建 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()
- 讀取 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.db
的 connection
連接 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()
...
- 編輯/更新 Update/Patch
需要前端提供id,才不會修改錯筆資料。
py
def update_item(request, myid):
- 刪除 Delete
需要前端提供id,才能對應相對資料進行刪除。
py
def delete_item(request, myid):
# 先找到id
del_item=Mytable.object.get(id=myid)
# 進行刪除
del_item.delete()
# 回應前端
- 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"),
]