django 1.8 官方文檔翻譯: 1-1-1 Django初探

Django 初探

因爲Django是在一個快節奏的新聞編輯室環境下開發出來的,所以它被設計成讓普通的網站開發工做簡單而快 捷。如下簡單介紹瞭如何用 Django 編寫一個數據庫驅動的Web應用程序。php

本文檔的目標是給你描述足夠的技術細節能讓你理解Django是如何工做的,可是它並不表示是一個新手指南或參考目錄 – 其實這些咱們都有! 當你準備新建一個項目,你能夠 重新手指南開始 或者 深刻閱讀詳細的文檔.html

設計你的模型(model)

儘管你在 Django 中能夠不使用數據庫,可是它提供了一個完善的能夠用 Python 代碼描述你的數據庫結構的對象關聯映射(ORM)。python

數據模型語法 提供了許多豐富的方法來展示你的模型 – 到目前爲止,它已經解決了兩個多年積累下來數據庫架構問題。下面是個簡單的例子,可能被保存爲 mysite/news/models.py:正則表達式

class Reporter(models.Model):
    full_name = models.CharField(max_length=70)

    def __unicode__(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)

    def __unicode__(self):
        return self.headline

安裝它

下一步,運行 Django 命令行工具來自動建立數據庫表:數據庫

manage.py syncdb

syncdb 命令會查找你全部可用的模型(models)而後在你的數據庫中建立還不存在的數據庫表。django

享用便捷的 API

接着,你就可使用一個便捷且功能豐富的 Python API 來訪問你的數據。API 是動態生成的,不須要代碼生成:編程

# 導入咱們在 "news "應用中建立的模型。
>>> from news.models import Reporter, Article

# 在系統中尚未 reporters 。
>>> Reporter.objects.all()
[]

# 建立一個新的 Reporter 。
>>> r = Reporter(full_name='John Smith')

# 將對象保存到數據庫。你須要顯示的調用 save() 方法。
>>> r.save()

# 如今它擁有了一個ID。
>>> r.id
1

# 如今新的 reporter 已經存在數據庫裏了。
>>> Reporter.objects.all()
[<Reporter: John Smith>]

# 字段被表示爲一個 Python 對象的屬性。
>>> r.full_name
'John Smith'

# Django 提供了豐富的數據庫查詢 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. Lookup parameters were {'id': 2}

# 建立一個 article.
>>> from datetime import date
>>> a = Article(pub_date=date.today(), headline='Django is cool',
...     content='Yeah.', reporter=r)
>>> a.save()

# 如今 article 已經存在數據庫裏了。
>>> Article.objects.all()
[<Article: Django is cool>]

# Article 對象有 API 能夠訪問到關聯到 Reporter 對象。
>>> r = a.reporter
>>> r.full_name
'John Smith'

# 反之亦然:Reporter 對象也有訪問 Article 對象的API。
>>> r.article_set.all()
[<Article: Django is cool>]

# API 會在幕後高效的關聯表來知足你的關聯查詢的需求。
# 如下例子是找出名字開頭爲 "John" 的 reporter 的全部 articles 。
>>> Article.objects.filter(reporter__full_name__startswith="John")
[<Article: Django is cool>]

# 經過更改一個對象的屬性值,而後再調用 save() 方法來改變它。
>>> r.full_name = 'Billy Goat'
>>> r.save()

# 調用 delete() 方法來刪除一個對象。
>>> r.delete()

一個動態的管理接口:它不只僅是個腳手架 – 仍是個完整的房子

一旦你的 models 被定義好,Django 能自動建立一個專業的,能夠用於生產環境的 管理界面 – 一個可以讓受權用戶添加,修改和刪除對象的網站。它使用起來很是簡單隻需在你的 admin site 中註冊你的模型便可。:後端

# In 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)


# In admin.py in the same directory...

import models
from django.contrib import admin

admin.site.register(models.Article)

這種設計理念是你的網站通常是由一個員工,或者客戶,或者僅僅是你本身去編輯 – 而你應該不會想要僅僅爲了管理內容而去建立後臺界面。緩存

在一個建立 Django 應用的典型工做流中,首先須要建立模型並儘量快地啓動和運行 admin sites, 讓您的員工(或者客戶)可以開始錄入數據。而後,纔開發展示數據給公衆的方式。架構

設計你的 URLs

一個乾淨的,優雅的 URL 方案是一個高質量 Web 應用程序的重要細節。 Django 鼓勵使用漂亮的 URL 設計,而且不鼓勵把不必的東西放到 URLs 裏面,像 .php 或 .asp.

爲了給一個 app 設計 URLs,你須要建立一個 Python 模塊叫作 URLconf。這是一個你的 app 內容目錄, 它包含一個簡單的 URL 匹配模式與 Python 回調函數間的映射關係。這有助於解耦 Python 代碼和 URLs 。

這是針對上面 Reporter/Article 例子所配置的 URLconf 大概樣子:

from django.conf.urls import patterns

urlpatterns = patterns('',
    (r'^articles/(\d{4})/$', 'news.views.year_archive'),
    (r'^articles/(\d{4})/(\d{2})/$', 'news.views.month_archive'),
    (r'^articles/(\d{4})/(\d{2})/(\d+)/$', 'news.views.article_detail'),
)

上面的代碼映射了 URLs ,從一個簡單的正則表達式,到 Python 回調函數(「views」)所在的位置。 正則表達式經過圓括號來「捕獲」 URLs 中的值。當一個用戶請求一個頁面時, Django 將按照順序去匹配每個模式,並停在第一個匹配請求的 URL 上。(若是沒有匹配到, Django 將會展現一個404的錯誤頁面。) 整個過程是極快的,由於在加載時正則表達式就進行了編譯。

一旦有一個正則表達式匹配上了,Django 將導入和調用對應的視圖,它其實就是一個簡單的 Python 函數。每一個視圖將獲得一個 request 對象 – 它包含了 request 的 meta 信息 – 和正則表達式所捕獲到的值。

例如:若是一個用戶請求了個 URL 「/articles/2005/05/39323/」, Django 將會這樣調用函數 news.views.article_detail(request, '2005', '05', '39323').

編寫你的視圖(views)

每一個視圖只負責兩件事中的一件:返回一個包含請求頁面內容的 HttpResponse 對象; 或拋出一個異常如 Http404 。至於其餘就靠你了。

一般,一個視圖會根據參數來檢索數據,加載一個模板而且根據該模板來呈現檢索出來的數據。 下面是個接上例的 year_archive 例子

def year_archive(request, year):
    a_list = Article.objects.filter(pub_date__year=year)
    return render_to_response('news/year_archive.html', {'year': year, 'article_list': a_list})

這個例子使用了 Django 的 模板系統,該模板系統功能強大且簡單易用,甚至非編程人員也會使用。

設計你的模板(templates)

上面的例子中載入了 news/year_archive.html 模板。

Django 有一個模板搜索路徑板,它讓你儘量的減小冗餘而重複利用模板。在你的 Django設置中,你能夠指定一個查找模板的目錄列表。若是一個模板沒有在這個 列表中,那麼它會去查找第二個,而後以此類推。

假設找到了模板 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 %}

變量使用雙花括號包圍。{{ article.headline }} 表示 「輸出 article 的 headline 屬性」。而點符號不只用於表示屬性查找,還可用於字典的鍵值查找、索引查找和函數調用。

注意 {{ article.pub_date|date:"F j, Y" }} 使用了 Unix 風格的「管道」(「|」符合)。這就是所謂的模板過濾器,一種經過變量來過濾值的方式。本例中,Python datetime 對象被過濾成指定的格式(在 PHP 的日期函數中能夠見到這種變換)。

你能夠無限制地串聯使用多個過濾器。你能夠編寫自定義的過濾器。你能夠定製自 己的模板標記,在幕後運行自定義的 Python 代碼。

最後,Django 使用了「模板繼承」的概念:這就是 {% extends "base.html" %} 所作的事。它意味着 「首先載入名爲 ‘base’ 的模板中的內容到當前模板,而後再處理本模板中的其他內容。」總之,模板繼承讓你在模板間大大減小冗餘內容:每個模板只須要定義它獨特的部分便可。

下面是使用了 靜態文件 的 「base.html」 模板的大概樣子:

{% load staticfiles %}
<html>
<head>
    <title>{% block title %}{% endblock %}</title>
</head>
<body>
    <img src="{% static "images/sitelogo.png" %}" alt="Logo" />
    {% block content %}{% endblock %}
</body>
</html>

簡單地說,它定義了網站的外觀(含網站的 logo ),並留下了個「洞」讓子模板來填充。這使站點的從新設計變得很是容易,只需改變一個文件 – 「base.html」 模板。

它也可讓你建立一個網站的多個版本,不一樣的基礎模板,而重用子模板。 Django 的建立者已經利用這一技術來創造了顯著不一樣的手機版本的網站 – 只需建立一個新的基礎模板。

請注意,若是你喜歡其餘模板系統,那麼你能夠不使用 Django 的模板系統。 雖然 Django 的模板系統特別集成了 Django 的模型層,但並無強制你使用它。同理,你也能夠不使用 Django 的數據庫 API。您可使用其餘數據庫抽象層,您能夠讀取 XML 文件,你能夠從磁盤中讀取文件,或任何你想要的方法去操做數據。 Django 的每一個組成部分: 模型、視圖和模板均可以解耦,之後會談到。

這僅僅是一點皮毛

這裏只是簡要概述了 Django 的功能。如下是一些更有用的功能:

一個 緩存框架 能夠與 memcached 或其餘後端緩存集成。
一個 聚合框架 可讓建立 RSS 和 Atom 的 feeds 同寫一個小小的 Python 類同樣容易。
更性感的自動建立管理站點功能 – 本文僅僅觸及了點皮毛。
顯然,下一步你應該 下載 Django,閱讀 入門教程 而且加入 社區. 感謝您的關注!

譯者:Django 文檔協做翻譯小組,原文:Overview

本文以 CC BY-NC-SA 3.0 協議發佈,轉載請保留做者署名和文章出處。

Django 文檔協做翻譯小組人手緊缺,有興趣的朋友能夠加入咱們,徹底公益性質。交流羣:467338606。

相關文章
相關標籤/搜索