初識 Django?Django 最初被設(shè)計用于具有快速開發(fā)需求的新聞類站點,目的是要實現(xiàn)簡單快捷的網(wǎng)站開發(fā)。以下內(nèi)容簡要介紹了如何使用 Django 實現(xiàn)一個數(shù)據(jù)庫驅(qū)動的 Web 應(yīng)用。 為了讓您充分理解 Django 的工作原理,這份文檔為您詳細(xì)描述了相關(guān)的技術(shù)細(xì)節(jié),不過這并不是一份入門教程或者是參考文檔(我們當(dāng)然也為您準(zhǔn)備了這些)。如果您想要馬上開始一個項目,可以從 實例教程 開始入手,或者直接開始閱讀詳細(xì)的 參考文檔 。 設(shè)計模型?Django 無需數(shù)據(jù)庫就可以使用,它提供了 對象關(guān)系映射器 通過此技術(shù),你可以使用 Python 代碼來描述數(shù)據(jù)庫結(jié)構(gòu)。 你可以使用強大的 數(shù)據(jù)-模型語句 來描述你的數(shù)據(jù)模型,這解決了數(shù)年以來在數(shù)據(jù)庫模式中的難題。以下是一個簡明的例子: mysite/news/models.py?
from django.db import models class Reporter(models.Model): full_name = models.CharField(max_length=70) def __str__(self): return self.full_name class Article(models.Model): pub_date = models.DateField() headline = models.CharField(max_length=200) content = models.TextField() reporter = models.ForeignKey(Reporter, on_delete=models.CASCADE) def __str__(self): return self.headline 應(yīng)用數(shù)據(jù)模型?然后,運行 Django 命令行工具來創(chuàng)建數(shù)據(jù)庫表: $ python manage.py migrate ...\> py manage.py migrate 這個 享用便捷的 API?接下來,你就可以使用一套便捷而豐富的 Python API 訪問你的數(shù)據(jù)。這些 API 是即時創(chuàng)建的,而不用顯式的生成代碼: # Import the models we created from our "news" app >>> from news.models import Article, Reporter # No reporters are in the system yet. >>> Reporter.objects.all() <QuerySet []> # Create a new Reporter. >>> r = Reporter(full_name='John Smith') # Save the object into the database. You have to call save() explicitly. >>> r.save() # Now it has an ID. >>> r.id 1 # Now the new reporter is in the database. >>> Reporter.objects.all() <QuerySet [<Reporter: John Smith>]> # Fields are represented as attributes on the Python object. >>> r.full_name 'John Smith' # Django provides a rich database lookup API. >>> Reporter.objects.get(id=1) <Reporter: John Smith> >>> Reporter.objects.get(full_name__startswith='John') <Reporter: John Smith> >>> Reporter.objects.get(full_name__contains='mith') <Reporter: John Smith> >>> Reporter.objects.get(id=2) Traceback (most recent call last): ... DoesNotExist: Reporter matching query does not exist. # Create an article. >>> from datetime import date >>> a = Article(pub_date=date.today(), headline='Django is cool', ... content='Yeah.', reporter=r) >>> a.save() # Now the article is in the database. >>> Article.objects.all() <QuerySet [<Article: Django is cool>]> # Article objects get API access to related Reporter objects. >>> r = a.reporter >>> r.full_name 'John Smith' # And vice versa: Reporter objects get API access to Article objects. >>> r.article_set.all() <QuerySet [<Article: Django is cool>]> # The API follows relationships as far as you need, performing efficient # JOINs for you behind the scenes. # This finds all articles by a reporter whose name starts with "John". >>> Article.objects.filter(reporter__full_name__startswith='John') <QuerySet [<Article: Django is cool>]> # Change an object by altering its attributes and calling save(). >>> r.full_name = 'Billy Goat' >>> r.save() # Delete an object with delete(). >>> r.delete() 一個動態(tài)管理接口:并非徒有其表?當(dāng)你的模型完成定義,Django 就會自動生成一個專業(yè)的生產(chǎn)級 管理接口 ——一個允許認(rèn)證用戶添加、更改和刪除對象的 Web 站點。你只需簡單的在 admin 站點上注冊你的模型即可: mysite/news/models.py?
from django.db import models class Article(models.Model): pub_date = models.DateField() headline = models.CharField(max_length=200) content = models.TextField() reporter = models.ForeignKey(Reporter, on_delete=models.CASCADE) mysite/news/admin.py?
from django.contrib import admin from . import models admin.site.register(models.Article) 這樣設(shè)計所遵循的理念是,站點編輯人員可以是你的員工、你的客戶、或者就是你自己——而你大概不會樂意去廢半天勁創(chuàng)建一個只有內(nèi)容管理功能的后臺管理界面。 創(chuàng)建 Django 應(yīng)用的典型流程是,先建立數(shù)據(jù)模型,然后搭建管理站點,之后你的員工(或者客戶)就可以向網(wǎng)站里填充數(shù)據(jù)了。后面我們會談到如何展示這些數(shù)據(jù)。 規(guī)劃 URLs?簡潔優(yōu)雅的 URL 規(guī)劃對于一個高質(zhì)量 Web 應(yīng)用來說至關(guān)重要。Django 推崇優(yōu)美的 URL 設(shè)計,所以不要把諸如 為了設(shè)計你自己的 URLconf ,你需要創(chuàng)建一個叫做 URLconf 的 Python 模塊。這是網(wǎng)站的目錄,它包含了一張 URL 和 Python 回調(diào)函數(shù)之間的映射表。URLconf 也有利于將 Python 代碼與 URL 進行解耦(譯注:使各個模塊分離,獨立)。 下面這個 URLconf 適用于前面 mysite/news/urls.py?
from django.urls import path from . import views urlpatterns = [ path('articles/<int:year>/', views.year_archive), path('articles/<int:year>/<int:month>/', views.month_archive), path('articles/<int:year>/<int:month>/<int:pk>/', views.article_detail), ] 上述代碼將 URL 路徑映射到了 Python 回調(diào)函數(shù)(“視圖”)。路徑字符串使用參數(shù)標(biāo)簽從URL中“捕獲”相應(yīng)值。當(dāng)用戶請求頁面時,Django 依次遍歷路徑,直至初次匹配到了請求的 URL。(如果無匹配項,Django 會調(diào)用 404 視圖。) 這個過程非???,因為路徑在加載時就編譯成了正則表達式。 一旦有 URL 路徑匹配成功,Django 會調(diào)用相應(yīng)的視圖函數(shù)。每個視圖函數(shù)會接受一個請求對象——包含請求元信息——以及在匹配式中獲取的參數(shù)值。 例如,當(dāng)用戶請求了這樣的 URL "/articles/2005/05/39323/",Django 會調(diào)用 編寫視圖?視圖函數(shù)的執(zhí)行結(jié)果只可能有兩種:返回一個包含請求頁面元素的 通常來說,一個視圖的工作就是:從參數(shù)獲取數(shù)據(jù),裝載一個模板,然后將根據(jù)獲取的數(shù)據(jù)對模板進行渲染。下面是一個 mysite/news/views.py?
from django.shortcuts import render from .models import Article def year_archive(request, year): a_list = Article.objects.filter(pub_date__year=year) context = {'year': year, 'article_list': a_list} return render(request, 'news/year_archive.html', context) 這個例子使用了 Django 模板系統(tǒng) ,它有著很多強大的功能,而且使用起來足夠簡單,即使不是程序員也可輕松使用。 設(shè)計模板?上面的代碼加載了 Django 允許設(shè)置搜索模板路徑,這樣可以最小化模板之間的冗余。在 Django 設(shè)置中,你可以通過 讓我們假設(shè) mysite/news/templates/news/year_archive.html?
{% extends "base.html" %} {% block title %}Articles for {{ year }}{% endblock %} {% block content %} <h1>Articles for {{ year }}</h1> {% for article in article_list %} <p>{{ article.headline }}</p> <p>By {{ article.reporter.full_name }}</p> <p>Published {{ article.pub_date|date:"F j, Y" }}</p> {% endfor %} {% endblock %} 我們看到變量都被雙大括號括起來了。 我們注意到 你可以將多個過濾器連在一起使用。你還可以使用你 自定義的模板過濾器 。你甚至可以自己編寫 自定義的模板標(biāo)簽 ,相關(guān)的 Python 代碼會在使用標(biāo)簽時在后臺運行。 Django 使用了 ''模板繼承'' 的概念。這就是 下面是 base.html 可能的樣子,它使用了 靜態(tài)文件 : mysite/templates/base.html?
{% load static %} <html> <head> <title>{% block title %}{% endblock %}</title> </head> <body> <img src="{% static "images/sitelogo.png" %}" alt="Logo"> {% block content %}{% endblock %} </body> </html> 簡而言之,它定義了這個網(wǎng)站的外觀(利用網(wǎng)站的 logo),并且給子模板們挖好了可以填的”坑“。這也讓網(wǎng)站的改版變得簡單無比——你只需更改這個根模板文件即可。 它還可以讓你利用不同的基礎(chǔ)模板并重用子模板創(chuàng)建一個網(wǎng)站的多個版本。Django 的創(chuàng)建者已經(jīng)利用這一技術(shù)來創(chuàng)造了明顯不同的手機版本的網(wǎng)站——只需創(chuàng)建一個新的基礎(chǔ)模板。 注意,你并不是非得使用 Django 的模板系統(tǒng),你可以使用其它你喜歡的模板系統(tǒng)。盡管 Django 的模板系統(tǒng)與其模型層能夠集成得很好,但這不意味著你必須使用它。同樣,你可以不使用 Django 的數(shù)據(jù)庫 API。你可以用其他的數(shù)據(jù)庫抽象層,像是直接讀取 XML 文件,亦或直接讀取磁盤文件,你可以使用任何方式。Django 的任何組成——模型、視圖和模板——都是獨立的。 |
|