Django的一目瞭然


因爲Django是在一個快節奏的新聞編輯室環境下開發的,它的目的是使常見的Web開發任務,快速和容易。下面是如何編寫使用Django的數據庫驅動的Web應用程序的一個非正式的概述。html

本文件的目的是給你足夠的技術細節瞭解的Django是如何工做的,可是這並不打算成爲一個教程或參考-但咱們已經有了兩個!當你準備開始一個項目,你能夠 用本教程開始或潛水右轉進入更詳細的文檔。python

設計模型程序員

雖然你可使用Django沒有數據庫,它配備了一個 對象關係映射器中,你描述你的數據庫佈局在Python代碼。正則表達式

該數據模型的語法提供了許多豐富的表明你的模型的方法-迄今爲止,它已經解決兩年價值數據庫的架構問題。下面是一個簡單的例子,它可能會被保存在文件mysite的/新聞/ models.py:數據庫

from django.db import modelsdjango


class Reporter(models.Model):後端

    full_name = models.CharField(max_length=70)緩存


    # On Python 3: def __str__(self):架構

    def __unicode__(self):app

        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 Python 3: def __str__(self):

    def __unicode__(self):

        return self.headline

安裝

接下來,運行Django的命令行實用程序來自動建立數據庫表:

$ python manage.py syncdb

在使用syncdb命令會在全部可用的模型和你對哪一個表不存在數據庫中建立表。

享受免費的API 

至此,你已經有了一個免費的,豐富的,Python的API 來訪問您的數據。API是動態建立,無代碼生成必要的:

# Import the models we created from our "news" app

>>> from news.models import Reporter, Article


# No reporters are in the system yet.

>>> Reporter.objects.all()

[]


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

[<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. Lookup parameters were {'id': 2}


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

[<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()

[<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")

[<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()

一個充滿活力的管理界面:它不僅是腳手架-它是整個房子¶

一旦你的模型的定義,Django的能夠自動建立一個專業的,生產準備管理界面 -一個網站,讓身份驗證的用戶添加,更改和刪除對象。這是由於註冊你的模型在管理網站同樣簡單:

# 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的應用程序之一典型的工做流程是創建模型,並獲得管理員的網站並儘量快地運行,所以您的員工(或客戶)能夠開始填充數據。而後,開發數據呈現給公衆的方式。

設計你的網址

一個乾淨,優雅的URL方案是在一個高品質的Web應用程序中一個重要的細節。Django的鼓勵美麗的URL設計,不把任何多餘文字中的URL,好比,PHP或。ASP。

要設計一個應用程序的URL,建立一個名爲Python模塊的URLconf。爲你的應用程序目錄,它包含URL模式和Python回調函數之間的簡單映射。的URLconfs也有助於去耦從Python代碼的URL。

下面是一個URL配置可能看起來像在記者 / 條 上面的例子:

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'),

)

上面的URL映射的代碼,就這麼簡單的正則表達式,爲Python的回調函數的位置(「意見」)。正則表達式使用圓括號從URL到「捕捉」的價值觀。當用戶請求一個頁面時,Django貫穿每一個模式中,爲了,並中止在第一個匹配所請求的URL。(若是其中沒有一個匹配,Django會調用一個特殊狀況404圖)。這是極快的,由於正則表達式在加載時編譯。

一旦匹配成功,Django導入並調用給定的觀點,這是一個簡單的Python函數。每一個視圖都被傳遞一個請求對象 - 其中包含請求的元數據 - 在正則表達式捕獲的值。

例如,若是用戶請求的URL「/ articles/2005/05/39323 /」時,Django會調用函數news.views.article_detail(請求, '2005', '05', '39323') 。

寫下您的意見

每一個視圖是負責作兩件事情之一:返回一個 HttpResponse對象包含請求頁面的內容對象,或者拋出一個異常,如Http404異常。剩下的就是你了。

一般,一個視圖根據參數中檢索數據,加載一個模板,並呈現與檢索到的數據的模板。下面是一個例子視圖 year_archive從上面:

from django.shortcuts import render_to_response


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的模板系統,它有幾個強大的功能,但努力保持足夠簡單,非程序員使用。

設計你的模板¶

上面的代碼加載新聞/ year_archive.html模板。

Django的有一個模板搜索路徑,它可讓你儘可能減小模板之間的冗餘。在你的Django設置,您指定的目錄列表來檢查使用模板TEMPLATE_DIRS。若是模板未在第一個目錄存在,它會檢查第二個,依此類推。

比方說,新聞/ 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.pub_date |日期:「F Ĵ, Y「 }}使用Unix風格的「管」(簡稱「|」字符)。這就是所謂的模板過濾器,它是一種方法來篩選變量的值。在這種狀況下,日期格式過濾器在給定的格式一個Python的datetime對象(如PHP的日期函數找到)。

你能夠連續使用盡量多的過濾器,只要你願意。您能夠編寫自定義模板過濾器。您能夠編寫 自定義的模板標籤,它運行自定義Python代碼在幕後。

最後,Django使用「模板繼承」的概念:這是什麼 {% 延伸 「base.html模板」 %}同樣。它的意思是「先裝所謂的'基地'的模板,它定義了一堆塊,並填寫塊經過下列功能塊。」總之,可讓您大大減小了冗餘的模板:每一個模板都有惟一肯定什麼是獨有的模板。

這裏的「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>

簡單地說,它定義站點(與該網站的標誌)的外觀和感受,並提供了「洞」的子模板來填補。這使得一個網站從新設計的改變做爲一個單獨的文件輕鬆 - 基本模板。

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

請注意,您沒必要使用Django的模板系統,若是你喜歡別的系統。儘管Django的模板系統是特別好,集成了Django的模型層,沒有什麼強迫你使用它。對於這個問題,你沒必要使用Django的數據庫API,不管是。您可使用其餘數據庫抽象層,能夠讀取XML文件,能夠讀取文件從磁盤,或者任何你想要的。每件做品的Django的 - 模型,視圖,模板 - 從下一脫鉤。

這僅僅是表面¶

這一直是Django的功能只是一個大概的瞭解。一些比較實用的功能:

一個緩存框架,與memcached的或其餘的後端集成。

一個聚合框架,使建立RSS和Atom供稿做爲寫一個小的Python類同樣簡單。

更性感自動生成的管理功能 - 這個概述僅僅觸及表面。

下一個明顯的步驟是讓你下載的Django,請閱讀本教程並加入社區。感謝您的關注!

相關文章
相關標籤/搜索