Spm flies you|Django|Newbie_Web

d.l.spm
10 min readApr 15, 2020

--

  • API(App、View、URLconf)
  • Model
  • ORM(QuerySet)
  • Admin

Django 基礎流程圖

這邊會和下一篇 Blog_Web 銜接上,所以 code 可以沿用

創建 Django 項目

$ django-admin.py startproject Blog_Basic

檢查是否成功(是否出現火箭)

$ python manage.py runserver

migrate (為了不想看到紅字)

$ python manage.py migrate

API

API (Application Programming Interface)應用程式接口
簡單來說就是後端和前端的橋樑。

依照功能去建立相對應的 app(Ex:登入登出、點餐功能…等等)。

App 創建

startapp

$ python manage.py startapp [app_name]
$ python manage.py startapp blog
│ ├── __init__.py #套件
│ ├── admin.py #設定資料庫呈現模式
│ ├── apps.py #用來區別 app
│ ├── migrations #
│ │ └── __init__.py #
│ ├── models.py #建構資料庫
│ ├── tests.py #檢查商業邏輯
│ └── views.py #Controller 負責商業邏輯的部分,和 urls.py 呼應

修改 setting.py -> INSTALLED_APPS (加入我們的 app)

INSTALLED_APPS = [
'django.contrib.admin',
'django.contrib.auth',
'django.contrib.contenttypes',
'django.contrib.sessions',
'django.contrib.messages',
'django.contrib.staticfiles',
'blog',
]

Views 視圖

把 View 想成是一個 function,處理 HttpRequest ,並傳 HttpResponse

1. new templates
2. 修改 settings.py
3. new html(templates/blog.html)
4. 帶入變數、使用 render

一、新增 templates 在專案根目錄

用來存放我們的 html 網頁
new Folder templates
(./Blog_Basic/blog/templates):存放 html

$ mkdir templates

二、修改 settings.py->TEMPLATES->DIRS(讓 Django 找到 template 位置)

'DIRS': [os.path.join(BASE_DIR, 'templates').replace('\\', '/')],

三、new blog.html(./Blog_Basic/blog/blog.html)

透過後端(views.py)傳值(變數 data)到前端(blog.html)
在 html 裡用
{{}}兩個大括號 來表示變數。

<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Blog</title>
</head>
<body>
<h1>{{blog_title}}</h1>
<p>{{blog_content}}</p>
</body>
</html>

四、帶入變數、使用 render

views.py (./Blog_Basic/blog/views.py)

from django.shortcuts import render
def index(request):
return render(request, 'blog.html', {
'blog_title': '孫子兵法',
'blog_content':'兵不厭詐、這是戰爭'
})

render function 產生要回傳的 HttpResponse 物件
參數:
request:HttpResponse 物件
template_name:index.html(選擇要顯示的 template)
dictionary:帶入 template 的變數

URLconf

處理瀏覽器的 URL,通常在 urls.py 設置
📌當收到 Httprequest 時,會比對URLconf,再決定要執行哪一個 view function。

path(url, view, name=None):處理要 Httpresponse 的頁面。
name:
相當於給 url 個全域變數,這樣就不用把路徑寫死可以更靈活跟延展性更高。

  • 複製 urls.py(./Blog_Basic/urls.py) -> urls.py(./blog/urls.py)

urls.py 設置

  • urls.py(./blog/urls.py)
from django.contrib import admin
from django.urls import path
from blog import views
urlpatterns = [
path('', views.index),
]
# name = None,方便之後取用 url 時只要呼叫 name 即可
# '', 設置連到 'blog' 的處理
  • urls.py(./Blog_Basic/urls.py)
from django.contrib import admin
from django.urls import path
urlpatterns = [
path('admin/', admin.site.urls),
path(r'', include('blog.urls')),
]
# include 讓first_app.urls 底下所有 url 前面都會自動加上 first_app/
# ''代表首頁
python manage.py runserver

Model

Django 預設是 SQLite,更改只需到 settings.py 更改 DATABASES 參數即可

  • models.py
  • makemigrations、migrate

新增 Model 步驟

1. 修改 models.py
2. 每次更改 model 內容後,都需要
makemigrationsmigrate

一、models.py

建構資料庫
1. 建立一個名為 music 的資料表
(每個 class 物件都是繼承 django.db.models.Model)
2. 欄位有(song, singer, last)

修改 models.py(./Blog_Basic/blog/models.py)

from django.db import modelsclass Post(models.Model):
title = models.CharField(max_length=100)
content = models.TextField()

def __str__(self):
return ("標題:{}, 字數:{}, 摘要:{}".format(self.title, len(self.content), self.content[:10]))

models.Model:表示要存進資料庫

models.CharField:定義有上限的字元
models.TextField:定義無上限的字串
models.DateTimeField:日期與時間(
auto_now紀錄最後修改、auto_now_add紀錄第一次修改
models.DecimalField:定義十進制數字
models.IntegerField(default=0):數值

default : 默認值
auto_now_add : 新增時會自動加上建立時間
auto_now : 資料更新時會自動加上更新時間
blank=False:不能為空
null=True:是否能空值(null)

二、makemigrations、migrate

與資料庫同步
makemigrations:建立一個 migration 檔案,紀錄修改的操作
migrate:透過 migration 檔案,去更新資料庫,且根據 INSTALLED_APPS 的設置,按照 app 順序建構、更新資料表。

$ python manage.py makemigrations
$ python manage.py migrate

檢視資料庫(Pycharm、SQLiteBrowser)

打開資料庫-> 選擇 db.sqlite3 -> Browse Data -> blog_post(選擇資料表)
  • 會發現 database 多了 id 欄位,因為 Django 預設自動加上 id 欄位並 primary key(主鍵)。

ORM(QuerySet)

請參考此篇:CRUD 部分

那學會 ORM 後如何把資料傳到網頁裡?

使用自定義模板 template tag(標籤)、filters(過濾器)

template tag

請參考以下有詳細過程

Admin

請參考以下從入門到上手有詳細過程

--

--

d.l.spm
d.l.spm

No responses yet