---
# System prepended metadata

title: 後端連json

---

# 以json做資料庫
因為django，sqLite的設定檔太多，所以我們其實可以用json來做資料庫。

---
# GET
實作GET API:
* GET all
* GET by ID
> 請注意複製以下程式碼後檔名等要做修改，不是直接照抄即可run
```python=
import json
from django.shortcuts import render
from django.conf import settings
import os

# 取得 JSON 路徑
JSON_PATH = os.path.join(settings.BASE_DIR, 'myapp', 'class_data.json')

def index(request):
    with open(JSON_PATH, 'r', encoding='utf-8') as f:
        data = json.load(f)
    return render(request, 'index.html', {'names': data})

def course(request, classname_pk):
    with open(JSON_PATH, 'r', encoding='utf-8') as f:
        data = json.load(f)
    # 找出對應的 id
    course_data = next((item for item in data if item['id'] == classname_pk), None)
    return render(request, 'course.html', {'course': course_data})
```
> 如果遇到編碼錯誤，可以試看看把utf-8改成utf-16
# 使用者輸入資料
實作POST
> add_course.html
```htmlmixed=
{% block content %}
<h1>新增課程</h1>
<form method="POST">
    {% csrf_token %}
    <label for="title">課程名稱：</label>
    <input type="text" id="title" name="name" required>
    <button type="submit">送出</button>
</form>
{% endblock %}
```
> views.py
```python=
def add_course(request):
    if request.method == 'POST':
        name = request.POST.get('name')

        # 讀取現有資料
        with open(JSON_PATH, 'r', encoding='utf-8') as f:
            data = json.load(f)

        # 自動生成新 id
        new_id = max([item['pk'] for item in data]) + 1 if data else 1

        # 新增資料
        new_course = {
            'pk': new_id,
            'fields': {
                'title': name
            }
        }
        data.append(new_course)

        # 寫回 JSON
        with open(JSON_PATH, 'w', encoding='utf-8') as f:
            json.dump(data, f, ensure_ascii=False, indent=4)

        return redirect('index')  # 新增完成後返回首頁

    # GET 請求 → 顯示表單
    return render(request, 'add_course.html') 
```
# 刪除資料
```html=
<a href="{% url 'delete_course' t.pk %}" 
style="color:#fff">退選</a>
```
```python=
def delete_course(request, pk):
    # 讀取現有資料
    with open(JSON_PATH, 'r', encoding='utf-8') as f:
        data = json.load(f)

    # 篩出不是要刪除的那筆
    data = [item for item in data if item['pk'] != pk]

    # 寫回 JSON
    with open(JSON_PATH, 'w', encoding='utf-8') as f:
        json.dump(data, f, ensure_ascii=False, indent=4)

    messages.success(request, '退選成功！')

    return redirect('index')
```

---

:::info
趁機宣傳一下我自己的個人網站跟Youtube頻道 !!

**[個人網站](https://hyc.eshachem.com/) | [Youtube頻道](https://www.youtube.com/@Hy.C)**
:::
@2025 Hy.C 陳毓
> Copyright ©Hy.C 陳毓 CC BY-NC-SA 4.0 | 禁止商業用途 | 轉載標記出處 | 改編作品必須在相同條款下分享。