Django帶有一個form庫,稱為django.forms,這個庫可以處理我們本章所提到的包括HTML表單顯示以及驗證。 接下來我們來深入瞭解一下form庫,並使用她來重寫contact表單應用。Django的newforms庫在Django社區上會經常看到django.newforms這個詞語。當人們討論django.newforms,其實就是我們本章裡面介紹的django.forms。改名其實有曆史原因的。
你需要一段context來解析模板。 一般情況下,這是一個 django.template.Context 的執行個體,不過在Django中還可以用一個特殊的子類, django.template.RequestContext ,這個用起來稍微有些不同。 RequestContext 預設地在模板context中加入了一些變數,如 HttpRequest 對象或當前登入使用者的相關資訊。當你不想在一系例模板中都明確指定一些相同的變數時,你應該使用 RequestContext 。
Djangos 內建的模板載入器(在先前的模板載入內幕章節有敘述)通常會滿足你的所有的模板載入需求,但是如果你有特殊的載入需求的話,編寫自己的模板載入器也會相當簡單。 比如:你可以從資料庫中,或者利用Python的綁定直接從Subversion庫中,更或者從一個ZIP文檔中載入模板。模板載入器,也就是 TEMPLATE_LOADERS 中的每一項,都要能被下面這個介面調用:load_template_source(template_name, template_dirs=None)參數
不管是寫自訂標籤還是過濾器,第一件要做的事是建立模板庫(Django能夠匯入的基本結構)。建立一個模板庫分兩步走: 第一,決定模板庫應該放在哪個Django應用下。 如果你通過 manage.py startapp 建立了一個應用,你可以把它放在那裡,或者你可以為模板庫單獨建立一個應用。 我們更推薦使用後者,因為你的filter可能在後來的工程中有用。 無論你採用何種方式,請確保把你的應用添加到 INSTALLED_APPS 中。 我們稍後會解釋這一點。
刪除欄位從Model中刪除一個欄位要比添加容易得多。 刪除欄位,僅僅只要以下幾個步驟: 刪除欄位,然後重新啟動你的web伺服器。 用以下命令從資料庫中刪除欄位:ALTER TABLE books_book DROP COLUMN num_pages;請保證操作的順序正確。 如果你先從資料庫中刪除欄位,Django將會立即拋出異常。刪除多對多關聯欄位由於多對多關聯欄位不同於普通欄位,所以刪除操作是不同的。
前一節的例子只是簡單的返回一個值。 很多時候設定一個模板變數而非傳回值也很有用。 那樣,模板作者就只能使用你的模板標籤所設定的變數。要在上下文中設定變數,在 render() 函數的context對象上使用字典賦值。 這裡是一個修改過的 CurrentTimeNode ,其中設定了一個模板變數 current_time ,並沒有返回它:class CurrentTimeNode2(template.Node): def __init__(self, format_string):
這裡先來借用一個書本(book)的資料模型作為例子:from django.db import modelsclass Publisher(models.Model): name = models.CharField(max_length=30) address = models.CharField(max_length=50) city = models.CharField(max_length=60) state_province =
當遇到一個模板標籤(template tag)時,模板解析器就會把標籤包含的內容,以及模板解析器自己作為參數調用一個python函數。 這個函數負責返回一個和當前模板標籤內容相對應的節點(Node)的執行個體。例如,寫一個顯示當前日期的模板標籤:{% current_time %}。該標籤會根據參數指定的 strftime 格式(參見:http://www.djangoproject.com/r/python/strftime/)顯示目前時間。首先確定標籤的文法是個好主意。
為了給你的對像添加一個行級功能,那就定義一個自訂方法。 有鑒於manager經常被用來用一些整表操作(table-wide),模型方法應該只對特殊模型執行個體起作用。這是一項在模型的一個地方集中商務邏輯的技術。最好用例子來解釋一下。 這個模型有一些自訂方法:from django.contrib.localflavor.us.models import USStateFieldfrom django.db import modelsclass Person(models.Model):
另外一類常用的模板標籤是通過渲染 其他 模板顯示資料的。 比如說,Django的後台管理介面,它使用了自訂的模板標籤來顯示新增/編輯表單頁面下部的按鈕。 那些按鈕看起來總是一樣的,但是連結卻隨著所編輯的對象的不同而改變。 這就是一個使用小模板很好的例子,這些小模板就是當前對象的詳細資料。這些排序標籤被稱為 包含標籤 。如何寫包含標籤最好通過舉例來說明。 讓我們來寫一個能夠產生指定作者對象的書籍清單的標籤。 我們將這樣利用標籤:{% books_for_author author
分析直至另一個模板標籤模板標籤可以像包含其它標籤的塊一樣工作(想想 {% if %} 、 {% for %} 等)。 要建立一個這樣的模板標籤,在你的編譯函數中使用 parser.parse() 。標準的 {% comment %} 標籤是這樣實現的:def do_comment(parser, token): nodelist = parser.parse(('endcomment',)) parser.delete_first_token() return
製作友好的模板Context你也許已經注意到範例中的出版商列表模板在變數 object_list 裡儲存所有的書籍。這個方法工作的很好,只是對編寫模板的人不太友好。 他們必須知道這裡正在處理的是書籍。 更好的變數名應該是publisher_list,這樣變數所代表的內容就顯而易見了。我們可以很容易地像下面這樣修改 template_object_name 參數的名稱:from django.conf.urls.defaults import *from django.views.generic
本文執行個體講述了Python調用MySQL預存程序並獲得傳回值的方法。分享給大家供大家參考。具體實現方法如下:try: conn = MySQLdb.connect ( host = 'localhost', user = 'root', passwd = 'pass', db = 'prod', port = 3306 ) cursor1=conn.cursor() cursor1.execute("CALL
direct_to_template 毫無疑問是非常有用的,但Django通用視圖最有用的地方是呈現資料庫中的資料。 因為這個應用實在太普遍了,Django帶有很多內建的通用視圖來協助你很容易 地產生對象的列表和明細視圖。讓我們先看看其中的一個通用視圖: 對象列表視圖。 我們使用第五章中的 Publisher 來舉例:class Publisher(models.Model): name = models.CharField(max_length=30) address =
使用者與Authentication通過session,我們可以在多次瀏覽器請求中保持資料, 接下來的部分就是用session來處理使用者登入了。 當然,不能僅憑使用者的一面之詞,我們就相信,所以我們需要認證。當然了,Django 也提供了工具來處理這樣的常見任務(就像其他常見任務一樣)。 Django 使用者認證系統處理使用者帳號,組,許可權以及基於cookie的使用者會話。 這個系統一般被稱為 auth/auth (認證與授權)系統。 這個系統的名稱同時也表明了使用者常見的兩步處理。
用函數封裝來處理複雜的資料過濾另一個常見的需求是按URL裡的關鍵字來過濾資料對象。 之前,我們在URLconf中寫入程式碼了出版商的名字,但是如果我們想用一個視圖就顯示某個任意指定的出版商的所有書籍,那該怎麼辦呢? 我們可以通過對 object_list 通用視圖進行封裝來避免 寫一大堆的手工代碼。 按慣例,我們先從寫URL配置開始:urlpatterns = patterns('', (r'^publishers/$', list_detail.object_list,
lighttpd (http://www.djangoproject.com/r/lighttpd/) 是一個輕量級的Web伺服器,通常被用來提供靜態頁面的訪問。 它天生支援FastCGI,因此除非你的網站需要一些Apache特有的特性,否則,lighttpd對於靜態和動態網頁面來說都是理想的選擇。確保 mod_fastcgi 在模組列表中,它需要出現在 mod_rewrite 和 mod_access ,但是要在 mod_accesslog
現在讓我們來仔細看看這個 queryset 。 大多數通用視圖有一個queryset參數,這個參數告訴視圖要顯示對象的集合。舉一個簡單的例子,我們打算對書籍列表按出版日期排序,最近的排在最前:book_info = { 'queryset': Book.objects.order_by('-publication_date'),}urlpatterns = patterns('', (r'^publishers/$', list_detail.object_list,
在同一個 Apache 執行個體中運行多個 Django 程式是完全可能的。 當你是一個獨立的 Web 開發人員並有多個不同的客戶時,你可能會想這麼做。只要像下面這樣使用 VirtualHost 你可以實現:NameVirtualHost * ServerName www.example.com # ... SetEnv DJANGO_SETTINGS_MODULE mysite.settings ServerName www2.example.com # ... SetEnv
有很多原因需要控制使用者訪問網站的某部分。一個簡單原始的限制方法是檢查 request.user.is_authenticated() ,然後重新導向到登陸頁面:from django.http import HttpResponseRedirectdef my_view(request): if not request.user.is_authenticated(): return HttpResponseRedirect('/accounts/login/?next=%s'