因為Django是在快節奏的新聞編輯室環境中開發的,它旨在使常見的Web開發任務變得快速而容易,我們可以在編寫很少代碼的情況下完成強大的功能。本文就在這個思想的指導下產生。讓我們見證一下寥寥幾行代碼即可擁有一個管理站點的魔幻魅力。
管理站點基本架構
MVC思想,包括模型層、視圖層、模板層
模型層
Django提供了一個抽象層(“模型”),用于構造和操縱Web應用程序的數據。模型是數據的唯一的、權威的信息源。它包含你所儲存數據的必要字段和行為。通常,每個模型對應數據庫中唯一的一張表。
每個模型都是django.db.models.Model 的一個Python 子類。
模型的每個屬性都表示為數據庫中的一個字段。
Django 提供一套自動生成的用于數據庫訪問的API。
一旦你建立好數據模型,Django 會自動為你生成一套數據庫抽象的API,可以讓你創建、檢索、更新和刪除對象。
最基本的對模型的應用僅僅只需要定義所需字段即可。
例如:
class Vm(models.Model):
name = models.CharField('云主機名稱', null=False, max_length=20)
image = models.CharField('云主機鏡像', max_length=20)
視圖層
Django 具有“視圖”的概念,用于封裝負責處理用戶請求及返回響應的邏輯。視圖是一個可調用對象,可以接收一個請求然后返回一個響應。這個可調用對象不僅僅限于函數,Django 同時提供一些可以用作視圖的類。它們允許你結構化你的視圖并且利用繼承和混合重用代碼。Django 提供基本的視圖類,它們適用于絕大多數的應用。所有的視圖類繼承自View 類,它負責將視圖連接到URL、HTTP 方法調度和其它簡單的功能。
視圖反映基本的Web開發中的一個常見情況:根據URL中的參數從數據庫中獲取數據、載入模板文件然后返回渲染后的模板。 由于這種情況非常普遍,Django提供了一種叫做“generic views”的系統可以方便地進行處理。
Generic views會將常見的模式抽象化,可以使你在編寫app時甚至不需要編寫Python代碼。
模板層
模板層提供了設計友好的語法來展示信息給用戶。
作為Web 框架,Django 需要一種很便利的方法以動態地生成HTML。最常見的做法是使用模板。模板包含所需HTML 輸出的靜態部分,以及一些特殊的語法,描述如何將動態內容插入。
Django 項目可以配置一個或多個模板引擎(甚至是零,如果你不需要使用模板)。Django 的模板系統自帶內建的后臺 —— 稱為Django 模板語言(DTL),以及另外一種流行的Jinja2。其他的模板語言的后端,可查找第三方庫。
Django 為加載和渲染模板定義了一套標準的API,與具體的后臺無關。加載包括根據給定的標識找到模板然后預處理,通常會將它編譯好放在內存中。渲染表示使用Context 數據對模板插值并返回生成的字符串。
Django 模板語言 是Django 原生的模板系統。直到Django 1.8,這是唯一可用的內置選項。盡管,它閉門造車,并且偏重某些方面,但是它仍然是一個優秀的模版庫。如果沒有特別緊急的理由選擇另外一種后臺,你應該使用DTL,特別是你編寫可插拔的應用并打算發布其模板的時候。Django 中包含模板的標準應用,例如django.contrib.admin,都使用DTL。
又由于歷史遺留原因,通用支持的模板引擎和Django實現的模板語言都在django.template 命名空間中。
模板引擎通過TEMPLATES 設置來配置。它是一個設置選項列表,與引擎一一對應。默認的值為空。在settings.py 定義了一些有用的值:
TEMPLATES = [
{
'BACKEND': 'django.template.backends.django.DjangoTemplates',
'DIRS': [],
'APP_DIRS': True,
'OPTIONS': {
# ... some options here ...
},
},
]
BACKEND 是一個指向實現了Django模板后端API的模板引擎類的帶點的Python路徑。內置的后端有 django.template.backends.django.DjangoTemplates 和 django.template.backends.jinja2.Jinja2.
由于絕大多數引擎都是從文件加載模板的,所以每種模板引擎都包含兩項通用設置:
- DIRS 定義了一個目錄列表,模板引擎按列表順序搜索這些目錄以查找模板源文件。
- APP_DIRS 告訴模板引擎是否應該進入每個已安裝的應用中查找模板。每種模板引擎后端都定義了一個慣用的名稱作為應用內部存放模板的子目錄名稱。
如果你的app只是簡單的操作,沒有復雜的業務,你不需要編寫Python代碼。
Admin 界面
Django 最強大的部分之一是自動生成的Admin 界面。它讀取模型中的元數據來提供一個強大的、生產環境就緒的界面,使內容提供者能立即用它向站點中添加內容。
- 添加 'django.contrib.admin'到INSTALLED_APPS 設置中.
- admin有四個依賴 - django.contrib.auth, django.contrib.contenttypes, django.contrib.messages 和django.contrib.sessions. 如果這些應用沒有在 INSTALLED_APPS 列表中, 那你要把它們添加到該列表中.
- 把django.contrib.messages.context_processors.messages 添加到TEMPLATES 中DjangoTemplates后臺的'context_processors'選項中,同樣把django.contrib.auth.middleware.AuthenticationMiddleware 和 django.contrib.messages.middleware.MessageMiddleware 添加到 MIDDLEWARE_CLASSES. (這些默認都是激活的,所以如果你手工操作過的話就需要按照以上方法進行設置..)
- 確定應用中的哪些模型應該在Admin 界面中可以編輯。
- 給每個模型創建一個ModelAdmin 類,封裝模型自定義的Admin 功能和選項。
- 實例化AdminSite 并且告訴它你的每一個模塊和ModelAdmin 類。
- 將AdminSite 實例綁定到URLconf。
示例
創建app
在我們前一篇文章中建立的項目中,創建一個cloud應用,在命令行中作如下操作:
E:
cd E:\PROJECTS\TEST\dj_admin
django-admin.py startapp cloud
當前目錄為 結構為:
dj_admin
|-- cloud
| |--migrations
| |-- __init__.py
| |-- admin.py
| |-- apps.py
| |-- models.py
| |-- tests.py
| |-- views.py
|-- dj_admin
|-- manage.py
編輯模型文件
我們修改 cloud/models.py 文件,代碼如下:
# encoding=utf-8
from __future__ import unicode_literals
from django.db import models
class Vm(models.Model):
name = models.CharField('云主機名稱', null=False, max_length=20)
image = models.CharField('云主機鏡像', max_length=20)
以上的類名代表了數據庫表名,且繼承了models.Model,類里面的字段代表數據表中的字段(name),數據類型則由CharField(相當于varchar)、null表示數據庫中該字段是否允許為NULL,max_length 參數限定長度。
注冊app
接下來在settings.py中找到INSTALLED_APPS這一項,如下:
INSTALLED_APPS = (
'django.contrib.admin',
'django.contrib.auth',
'django.contrib.contenttypes',
'django.contrib.sessions',
'django.contrib.messages',
'django.contrib.staticfiles',
'cloud', # 添加此項
)
注冊模型到管理站點
為了讓 admin 界面管理某個數據模型,我們需要先注冊該數據模型到 admin。修改 cloud/admin.py:
# encoding=utf-8
from django.contrib import admin
from cloud.models import Vm
# Register your models here.
admin.site.register(Vm)
我們所做的事情
好了,我們僅僅只需要做上面一些編寫和設置,即可以實現對Vm這一實體的所有操作,即我們常用的增、刪、改、查。我們做了如下動作:
創建app
編輯模型文件
注冊app到配置項中
注冊模型到管理站點
啟動服務查看效果
我們在命令行中通過命令行啟動服務
python manage.py makemigrations # 讓 Django 知道我們在模型上有一些變更
python manage.py migrate # 創建表結構
python manage.py runserver 0.0.0.0:8000 # 0.0.0.0 讓其它電腦可連接到此服務器,8000 為端口號。如果不說明,那么端口號默認為 8000。
在瀏覽器中訪問我們的站點http://localhost:8000/admin/,并登錄??梢钥吹焦芾砹斜眄?,多了cloud管理列表:
添加Vm頁面
Vm列表
修改Vm和編輯Vm