第一部分:Django與Ajax:介紹和安裝
近來我開始向正在用Django開發(fā)的一個(gè)項(xiàng)目中添加Ajax技術(shù),開始有點(diǎn)坎坷。有關(guān)于這方面可用的文檔資料幾乎找不到。這里所寫的文章就算是我為改變這種資料貧乏的現(xiàn)狀所做的一點(diǎn)微薄的努力吧。
我將分6個(gè)部分來介紹使用Ajax和Django創(chuàng)建動(dòng)態(tài)網(wǎng)站,這篇文章是第一部分。
第一部分:Django與Ajax:介紹和安裝
第二部分:Django與Prototype:Ajax Updater(動(dòng)態(tài)更新內(nèi)容)
第三部分:Django與Prototype:Ajax Request(send data out of band)
第四部分:Django與Script.aculo.us:Sortables(Drag and Drop)
第五部分:Django與Script.aculo.us:Visual Effects(Web2.0 Kitsch)
介紹與安裝
這篇文章將逐步的讓你獲得本教程中其它章節(jié)所用到的一些庫(kù)
。這里將它分為兩部分:第一部分是對(duì)安裝的一個(gè)快速概述-這應(yīng)該足以讓一名有Django經(jīng)驗(yàn)的用戶配置他的系統(tǒng)-在概述之后我將給那些Django開發(fā)新手做一個(gè)循序漸進(jìn)的安裝講解。(只要你已經(jīng)看完了這個(gè)Django教程,應(yīng)該是可以很好的理解這篇文章的)
安裝概述
我們需要做的第一件事情就是獲取Protoculouse庫(kù)
,它是結(jié)合了Prototype和Script.aclo.us,并被高比例壓縮的一個(gè)庫(kù)。從這里下載Protoculous庫(kù)。
在你下載的Protoculous庫(kù)文件名中會(huì)標(biāo)明多種的版本號(hào)數(shù)字,這里我選用的是protoculous-1.0.2-packed.js這個(gè)版本的(因?yàn)槲恼碌陌l(fā)表時(shí)間不同,可能會(huì)有各種不同的版本號(hào))。你需要將protoculous-1.0.2-packed.js文件放到可以靜態(tài)的使用它的位置。
下一步你需要把protoculous庫(kù)的引用添加到項(xiàng)目的base模板中(你一定在每個(gè)項(xiàng)目中都使用了一個(gè)base模板,對(duì)嗎?)。我的base模板的相關(guān)行像下面這樣:
{% block javascript %}
<script type="text/javascript" src="http://127.0.0.1/media/protoculous-1.0.2-packed.js"></script>
{% endblock %}
這段代碼被放到了templates文件夾中ajaxapp/base.html文件的header部分。說到文件夾,如果你按照我的文件夾的層次來安排,整個(gè)過程就會(huì)變得相當(dāng)容易,但如果你不按我的文件夾層次來安排,可能或多或少的需要做一些瑣碎的變化。
我的文件夾層次
在ajaxproject文件夾中有一個(gè)ajaxapp應(yīng)用文件夾,還有一個(gè)templates文件夾。在templates文件夾中還有一個(gè)叫ajaxapp的文件夾。
這就是你所需要做的。如果你覺得上面說的有些太快了,那下面我將逐步的對(duì)它們進(jìn)行詳細(xì)的介紹。
循序漸進(jìn)的安裝過程
安裝Django
我們需要的第一個(gè)東西就是Django。如果你沒有從Subversion中簽出的版本,那么你得先去簽出(如果你沒有使用Subversion(在命令行中輸入svn進(jìn)行簽出),那么就去獲取Django的最新安裝包吧。安裝包與Subversion版本不一致的地方可能是一個(gè)issue)。從Subversion中簽出django包使用下面的命令:
下載完成后你需要使用下面的命令去安裝它們:
cd trunk
python setup.py install
你要使用相應(yīng)的python版本去安裝Django庫(kù)
,如果你的服務(wù)器上有多個(gè)版本的Python,那么你需要分別對(duì)它們進(jìn)行安裝:
python2.4 setup.py install
python2.5 setup.py install
安裝Protoculous
Protoculous非常容易獲取,Script.aculo.us和Prothotype都我們都會(huì)用到。從下載頁(yè)面上僅需要獲取z
ip文件,它包含兩個(gè)的庫(kù),并用高壓縮比將它們壓縮到一個(gè)文件中。這個(gè)文件中會(huì)包含不同的版本號(hào),我們將使用protoculous-1.0.2.packed.js這個(gè)版本。
安裝XAMPP
我們將使用XAMPP來為我們的靜態(tài)文件服務(wù)。它比修改urls
.py文件要更容易請(qǐng)求得到某些靜態(tài)文件。這里下載XAMPP。它包含一個(gè)標(biāo)準(zhǔn)的安裝程序("double click and if doesn't work its someone else's fault" variety.)。
設(shè)置XAMPP
你現(xiàn)在打算要運(yùn)行XAMPP了,啟動(dòng)之后,你可能就要想在上面打開它的Apache服務(wù)了。你還需要決定到htdocs文件夾(這是Apache服務(wù)器在XAMPP中用來輸出內(nèi)容的文件夾)的絕對(duì)路徑。我的路徑是'/Applications/xampp/xamppfiles/htdocs/',但你的可能會(huì)與我的不同(取決于你的操作系統(tǒng))。在文件夾里創(chuàng)建一個(gè)名叫"ajaxproject"的文件夾。然后復(fù)制一個(gè)protoculous-1.0.2-packed.js文件到你剛剛創(chuàng)建的中文件夾中。
設(shè)置Django
第一步需要在Django中創(chuàng)建一個(gè)項(xiàng)目。進(jìn)到你想要?jiǎng)?chuàng)建項(xiàng)目的目錄然后輸入:
django-admin.py startproject ajaxproject
現(xiàn)在我們來創(chuàng)建以后會(huì)用到的文件夾。在ajaxproject文件夾中創(chuàng)建一個(gè)templates文件夾,在templates文件中再創(chuàng)建一個(gè)ajaxapp文件夾。然后開始修改settings.py文件。
設(shè)置settings.py
在我們的開發(fā)環(huán)境中將使用SQLite作為數(shù)據(jù)庫(kù)
,因此我們需要在項(xiàng)目中安裝數(shù)據(jù)庫(kù)。進(jìn)到你剛剛創(chuàng)建ajaxproject文件夾中打開settings.py文件。數(shù)據(jù)庫(kù)配置就像這個(gè)樣子(絕對(duì)路徑可能因?yàn)椴僮飨到y(tǒng)不同而與我的有差異):
DATABASE_ENGINE = 'sqlite3′
DATABASE_NAME = '/Users/will/ajaxproject/ajax.db'
DATABASE_USER = "
DATABASE_PASSWORD = "
DATABASE_HOST = "
DATABASE_PORT = "
接下來你就要根據(jù)本地XAMPP來修改MEDIA_ROOT和MEDIA_URL設(shè)置了。根據(jù)你安裝XAMPP的media文件夾的路徑不同,你的設(shè)置也會(huì)略有不同,但它們看起應(yīng)該差不多是這個(gè)樣的:
MEDIA_ROOT = '/Applications/xampp/xamppfiles/htdocs/ajaxproject/'
MEDIA_URL = 'http://127.0.0.1/ajaxproject/'
讓我們把Django的管理程序也添加進(jìn)來,我們隨后將會(huì)創(chuàng)建的應(yīng)用程序ajaxapp也要放到INSTALLED_APPS中。你的INSTALLED_APPS應(yīng)該像這樣:
INSTALLED_APPS = (
'django.contrib.auth',
'django.contrib.contenttypes',
'django.contrib.sessions',
'django.contrib.sites',
'django.contrib.admin',
'ajaxproject.ajaxapp',
)
我們最后修改settings.py來聲明templates文件夾的位置。確切的路徑取決于你早些時(shí)候創(chuàng)建的文件夾的位置。
TEMPLATE_DIRS = (
"/Users/will/ajaxproject/templates",
)
我們已經(jīng)完成了對(duì)settings.py文件的修改,現(xiàn)在可以關(guān)掉它并繼續(xù)往下進(jìn)行了。
創(chuàng)建我們的應(yīng)用
現(xiàn)在我們來創(chuàng)建在settings.py文件中已經(jīng)包含了的"ajaxapp"應(yīng)用(在ajaxproject文件夾中運(yùn)行下面的命令行)。
python manage.py startapp ajaxapp
創(chuàng)建數(shù)據(jù)庫(kù):
python manage.py runserver
如果一切都能正常運(yùn)轉(zhuǎn),你會(huì)看到一個(gè)Django友好的占位頁(yè)面。真是太神奇了。
設(shè)置urls.py文件
我們將需要在做其它修改的時(shí)候一并對(duì)urls.py文件進(jìn)行相應(yīng)的修改。我們需要告訴它ajaxapp這個(gè)應(yīng)用轉(zhuǎn)換url所需要的相關(guān)urls列表。
from django.conf.urls.defaults import *
urlpatterns = patterns(",
(r'^admin/', include('django.contrib.admin.urls')),
(r'^', include('ajaxproject.ajaxapp.urls')),
)
我們同時(shí)也需要將urls.py復(fù)制一份到ajaxapp文件夾中。
我們將會(huì)在后面的教程中對(duì)ajaxapp/urls.py進(jìn)行修改,但我們現(xiàn)在不會(huì)把它搞亂。
創(chuàng)建base模板
安裝的最后部分就是創(chuàng)建一個(gè)base.html模板文件
,其它所有模板都會(huì)從這個(gè)文件中進(jìn)行擴(kuò)展。在項(xiàng)目中有一個(gè)base模板是一個(gè)不錯(cuò)的做法,在這種情況下它讓我們只導(dǎo)入一次javascript庫(kù)就可以了。我們的base.html文件將被放在ajaxproject/templates/ajaxapp/文件夾下,并被命名為.....base.html。
<html lang=en>
<head>
{% block javascript %}
<script type="text/javascript" src="http://127.0.0.1/ajaxproject/protoculous-1.0.2-packed.js"></script>
{% endblock %}
<title> {% block title %} Pastie Lobby {% endblock %} </title>
</head>
<body>
{% block content %}{% endblock content %}
</body>
</html>
完成安裝
好啦,我們現(xiàn)在完成了對(duì)ajaxproject項(xiàng)目和ajaxap
p應(yīng)用的設(shè)置。我們也為靜態(tài)文件設(shè)置了XAMPP。我們已經(jīng)為下一步實(shí)際的Ajax開發(fā)做好了準(zhǔn)備工作。點(diǎn)擊這里進(jìn)入到教程的第二部分。
第二部分:Django和Prototype:(動(dòng)態(tài)更新內(nèi)容)
Ajax的一個(gè)通常用途是更新你網(wǎng)站頁(yè)面的一部分而不必重新加載整個(gè)頁(yè)面。這項(xiàng)功能可以使用Prototype包中的Ajax.Updater()來輕松完成。你可以從
這里獲取已完成的示例源代碼。
Ajax.Updater的語(yǔ)法和目的
首先,讓我們先來看一下它的語(yǔ)法(所有的客戶端編碼都要用javascript完成,但如果你以前沒有做過任何javascript開發(fā)也不要被嚇倒,因?yàn)樗浅:?jiǎn)單)。
new Ajax.Updater(‘id_to_update’, ‘url_to_send_to’, options)
第一個(gè)參數(shù)是你打算要更新的html元素的id.例如你可能會(huì)創(chuàng)建一個(gè)像這樣的div:
<div id="edit_div"></div>
第二個(gè)參數(shù)是你要發(fā)送消息的URL。通常它就像“edit/update/”這樣,我們稍后將通過例子將它一點(diǎn)一點(diǎn)的具體化。
第三個(gè)參數(shù)是一個(gè)包含了指定項(xiàng)的字典,通常你要指定它是一個(gè)異步更新(否則你的網(wǎng)頁(yè)將被凍結(jié),直到接收到回應(yīng),這樣不太符合我們需要的用戶接口特性),并且你要指定如何發(fā)送數(shù)據(jù)(盡管你不是經(jīng)常用到發(fā)送數(shù)據(jù),但如果你需要那么做,你將會(huì)用到POST)以及POST的參數(shù)。
因此,使用Ajax.Updater的時(shí)候需要像下面的例子一樣填寫參數(shù):
<script type="text/javascript">
function update_div() {
new Ajax.Updater(‘my_div’, ‘/update/’, {asynchronous:true})
}
</script>
<div id="my_div" onclick="update_div();">The list is empty.</div>
這段例程將會(huì)向URL /update/ 發(fā)送一個(gè)更新請(qǐng)求,并且使用 /update/ 返回的html內(nèi)容來替換my_div中的內(nèi)容。
現(xiàn)在讓我們來做一個(gè)實(shí)際的例子。
在Django應(yīng)用中使用Ajax.Updater
我們打算創(chuàng)建一個(gè)如何在Django中使用Ajax.Updater的簡(jiǎn)單示例。我們的網(wǎng)頁(yè)在開始的時(shí)候顯示一個(gè)0和一個(gè)1,在每次你單擊包含著0和1的這個(gè)div的時(shí)候就會(huì)顯示Fibonacci序列的下一個(gè)值(不用重新加載整個(gè)頁(yè)面)。
修改urls.py
首先我們需要修改ajaxapp/urls.py文件。我們將要?jiǎng)?chuàng)建兩個(gè)鏈接,第一個(gè)將用來顯示我們的頁(yè)面,第二個(gè)是用來轉(zhuǎn)換更新請(qǐng)求的鏈接。你的urls.py(在ajaxproject/ajaxapp/中的那一個(gè))要像這樣修改:
from django.conf.urls.defaults import *
urlpatterns = patterns(‘ajaxproject.ajaxapp.views’,
(r‘^$’, ‘index’),
(r‘^refresh/$’, ‘refresh’),
)
創(chuàng)建視圖
我們的視圖文件非常簡(jiǎn)單,它將引用到一些還沒有被創(chuàng)建的模板,但不用介意(我們將在下一步進(jìn)行創(chuàng)建)
from django.shortcuts import render_to_response
FIB = [0,1]
def get_fib_sequence():
global FIB
FIB.append(FIB[-1] + FIB[-2])
return FIB
def index(request):
return render_to_response("ajaxapp/index.html",
{ ‘fib_sequence’ : [0,1] }
)
def refresh(request):
fib_sequence = get_fib_sequence()
return render_to_response("ajaxapp/fib.html",
{ ‘fib_sequence’ : fib_sequence }
)
為了節(jié)省時(shí)間,我們將get_fib_sequence函數(shù)放到了視圖中,這是一種不明智的做法,在實(shí)際的開發(fā)中我們會(huì)將它放到一個(gè)單獨(dú)的文件中。
我們只是在視圖中簡(jiǎn)單的渲染了一下模板并把它們返回-我們沒有做更多的處理。這就是Ajax.Updater美好的地方:它將簡(jiǎn)單的把所返回的任意html插入到指定位置。
創(chuàng)建模板
現(xiàn)在我們來創(chuàng)建在視圖中被引用到的兩個(gè)模板:ajaxapp/index.html和ajaxapp/fib.html。
index.html模板相當(dāng)簡(jiǎn)單,它將擴(kuò)展自我們先前創(chuàng)建的base.html(在本系列文章的第一部分)。它包含了一些javascript,一個(gè)header和一個(gè)用來裝載Fibonacci序列的div(它將被fib.html模板渲染)。ajaxapp/index.html模板就像這樣:
{% extends ‘ajaxapp/base.html’ %}
{% block content %}
<script type="text/javascript">
function update_fib() {
new Ajax.Updater(’fib_div’, ‘refresh/’, {asynchronous:true});
}
</script>
<h1> The Fibonacci Sequence </h1>
<div id="fib_div" onclick="update_fib();">
{% include ‘ajaxapp/fib.html’ %}
</div>
{% endblock %}
我們來創(chuàng)建ajaxapp/fib.html模板:
<ul>
{% for entry in fib_sequence %}
<li>{{ entry }}</li>
{% endfor %}
</ul>
再次看來這是一個(gè)相當(dāng)簡(jiǎn)單的模板。你將發(fā)現(xiàn)在Django中你做更多的Ajax時(shí),創(chuàng)建小助手模板真的能使你的生活更輕松。記住,這是一個(gè)好的模式。
結(jié)束
OK,現(xiàn)在我們寫完了模板,就全部完成啦。啟動(dòng)起來開發(fā)服務(wù)器:
python manage.py runserver
然后你就到網(wǎng)頁(yè)這里,在0和1的地方點(diǎn)擊來查看它的運(yùn)行結(jié)果。
當(dāng)你準(zhǔn)備好的時(shí)候你就可以繼續(xù)本教程
下一部分的學(xué)習(xí)了。下一部分將說明在不離開當(dāng)前頁(yè)面的情況下使用Ajax.Request發(fā)送數(shù)據(jù)或命給Django。
第三部分:Django與Prototype:Ajax Request(非對(duì)稱模式發(fā)送數(shù)據(jù))
Ajax另一個(gè)常用的功能是發(fā)送數(shù)據(jù)到服務(wù)器但不強(qiáng)制用戶重新加載他們所在的整個(gè)頁(yè)面。在Django與Ajax教程的第三節(jié)中我們將要向Server發(fā)送Django生成表單的內(nèi)容。(Request和Upater不同之處是Requset對(duì)象不需要服務(wù)器進(jìn)行應(yīng)答,下面將更加深入的進(jìn)行解釋。)你可以從這里得到本節(jié)例子的源碼。
Ajax Request語(yǔ)法和目的
Ajax.Requst負(fù)責(zé)的是從網(wǎng)頁(yè)到服務(wù)器的單向交流。它大概就像網(wǎng)頁(yè)說“嗨,這家伙創(chuàng)建了一個(gè)帳號(hào),我已經(jīng)知道該怎么做了,所以不要理會(huì)給我的指令”,或者可能像網(wǎng)頁(yè)說:“server my man, you have a new comment to hold onto until someone can approve it.(你有一條新的評(píng)論需要保持直到有人批準(zhǔn)它--這句話不太明白是嘛意思)”當(dāng)你希望使用Ajax.Request從服務(wù)器得到一些HTML來填充div,或者從服務(wù)器得到任何種類的響應(yīng)時(shí),它是沒有用的,你將什么也得不到。
Ajax.Request的語(yǔ)法為:
new Ajax.Request(‘url/to/send/to’, config)
第一個(gè)參數(shù)是你發(fā)送數(shù)據(jù)的目標(biāo)URL,第二個(gè)是一個(gè)包含配置數(shù)據(jù)的字典變量。跟Ajax Updater一樣你需要指定要發(fā)送的數(shù)據(jù),發(fā)送方式,是否異步(它通常是異步的,除非你和用戶有仇…)。這里有兩個(gè)可能在實(shí)際中使用的例子:
var post = ‘id=’ + id;
new Ajax.Request(‘category/remove/’, {asynchronous:true, method:‘post’, postBody:post});
或
new Ajax.Request(‘category/add’, {asynchronous:true, parameters:Form.serialize(form)});
這兩個(gè)例子中的第二個(gè)例子要復(fù)雜一些,因?yàn)樗褂?/span>Prototype中的Form庫(kù)來序列化一個(gè)表單。第一次看到它可能會(huì)覺得有點(diǎn)混亂,但在我們的例子中將會(huì)看一下它到底如何在模板和視圖中設(shè)置和轉(zhuǎn)化被序列化的表單。
在Django應(yīng)用中使用Ajax.Request
在文章開始我們就談到,我們要?jiǎng)?chuàng)建一個(gè)有簡(jiǎn)單表單的頁(yè)面,當(dāng)我們按下提交按鈕的時(shí)候表單就會(huì)被發(fā)送到服務(wù)器。在發(fā)送后我們將會(huì)使用Prototype的Form庫(kù)來重置這個(gè)表單。
盡管略有牽強(qiáng),但這個(gè)例子的確與真實(shí)用例很相似。你已經(jīng)知道在沒有任何服務(wù)器指令的時(shí)候如何回應(yīng)某些刺激,但你還是需要將所發(fā)生的一切通知服務(wù)器。一種情況是當(dāng)你從一個(gè)頁(yè)面上刪除內(nèi)容的時(shí)候:你可以在客戶端使用JavaScript從問題中移除元素,但仍必須讓服務(wù)器知道哪些元素被刪除。
總之,讓我們開始編碼吧。
修改urls.py
我們將在ajaxapp/urls.py文件中添加兩個(gè)入口。一個(gè)將用來顯示頁(yè)面,另一個(gè)將用來處理發(fā)送過來的已完成表單。
我們把ajaxapp/urls.py修改成這樣:
from django.conf.urls.defaults import *
urlpatterns = patterns(‘ajaxproject.ajaxapp.views’,
(r‘^$’, ‘index’),
(r‘^send/$’, ’send’),
)
十分簡(jiǎn)單。接下來讓我們處理Views。
創(chuàng)建視圖
我們需要在視圖中添加兩個(gè)函數(shù)---index和send。我們也會(huì)將表單和視圖寫在一起(在一個(gè)大的工程中最好將模型從視圖中獨(dú)立出來)。
模型會(huì)有兩個(gè)字段,一個(gè)character字段和一個(gè)textarea字段。我們將通過newforms庫(kù)來創(chuàng)建它,像下面這樣:
class CommentForm(forms.Form):
name = forms.CharField(required=False)
text = forms.CharField(widget=Textarea, required=False)
現(xiàn)在有了(簡(jiǎn)單的)表單,我們需要去創(chuàng)建兩個(gè)視圖函數(shù)。首先,我們需要使用index函數(shù)去渲染amaxapp/index.html這個(gè)模板,同時(shí)還要確保將一個(gè)“form”變量傳給了它。
def index(request):
form = CommentForm()
return render_to_response("ajaxapp/index.html",{ ‘form’ : form})
我們還需要?jiǎng)?chuàng)建send函數(shù)來處理接收到的表單數(shù)據(jù)。為了簡(jiǎn)單,我們僅僅向標(biāo)準(zhǔn)輸出設(shè)備打印一個(gè)格式化好的輸入文本(也就是說你可以從你的開發(fā)服器終端窗口上來看到輸出結(jié)果)。
def send(request):
post = request.POSTfor key in post.keys():
print "key: " , key , "; value: " , post[key]
實(shí)際應(yīng)用中你可能會(huì)根據(jù)接收到的數(shù)據(jù)創(chuàng)建一個(gè)新的Model實(shí)例,或者可能通過新值來更新現(xiàn)有實(shí)例。幸好很容易從表單中獲取鍵值。
請(qǐng)注意,因?yàn)槲覀兘邮盏降氖且粋€(gè)通過newforms庫(kù)創(chuàng)建的、已經(jīng)被序列化的表單,它很容易使用已經(jīng)接收到的request.POST數(shù)據(jù)來轉(zhuǎn)換成為一個(gè)已創(chuàng)建的表單的實(shí)例。就像下面這樣簡(jiǎn)單:
def send(request):
post = request.POST
form = CommentForm(post)
還不算太壞。如果你用form_for_model方法創(chuàng)建了一個(gè)表單將會(huì)特別的方便,此時(shí),你可以簡(jiǎn)單的調(diào)用form.save()方法來創(chuàng)建一個(gè)新的Model實(shí)例。
好了,如果我們把模型和視圖函數(shù)放在一塊,那么整個(gè)的views.py文件將會(huì)是這樣:
from django.shortcuts import render_to_response
from django import newforms as forms
class CommentForm(forms.Form):
name = forms.CharField(required=False)
text = forms.CharField(widget=forms.Textarea, required=False)
def index(request):
form = CommentForm()
return render_to_response("ajaxapp/index.html",
{ ‘form’ : form }
)
def send(request):
post = request.POST
for key in post.keys():
print "key: " , key , "; value: " , post[key]
創(chuàng)建模板
我們這個(gè)例子只需要一個(gè)簡(jiǎn)單的模板,它將用來顯示前面創(chuàng)建的CommentForm表單,并且它還將有一些輔助的javascript來覆蓋表單缺省的提交處理。這個(gè)模板擴(kuò)展自我們?cè)诮坛痰谝徊糠謩?chuàng)建的ajaxapp/base.html模板。
{% extends ‘ajaxapp/base.html’ %}
{% block content %}
<script type="text/javascript">
function send_form(form) {
new Ajax.Request("send/", {asynchronous:true, parameters:Form.serialize(form)});
Form.reset(form);
return false;
}
</script>
<h1> Submit Comments </h1>
<form method="post" action="." onsubmit="return send_form(this);">
<table>
{{ form }}
<tr>
<td></td>
<td>
<input type="submit" value="Send!" />
</td>
</tr>
</table>
{% endblock %}
注意我們是如何來覆蓋表單的onsubmit缺省方法的。因?yàn)槲覀冊(cè)谡{(diào)用中返回了false,所以缺省的提交機(jī)處理將永不被觸發(fā)。此外,我們還使用了Prototype的Form庫(kù)中的一個(gè)有用的方法在發(fā)送完數(shù)據(jù)后來重置表單。
我們還使用了Form庫(kù)中的一個(gè)便利的方法來序列化這個(gè)表單。可以使用文章開頭附近第一個(gè)例子的語(yǔ)法來創(chuàng)建你自己任意的post strings…如果行的話它會(huì)非常容易被序列化。
結(jié)束
現(xiàn)在我們已經(jīng)完成了urls的添加,模板的創(chuàng)建,以及視圖的編碼:一切搞定!
運(yùn)行一下開發(fā)服務(wù)器
python manage.py runserver
往表單字段里輸入一些數(shù)據(jù)然后點(diǎn)擊提交按鈕。你將看到所發(fā)出的消息會(huì)從開發(fā)服務(wù)器的終端窗口上被打印出來。
花一些時(shí)間來多加練習(xí),后面還有第四部分等著你呢。我將在第四部分中介紹使用Scriptaculous來拖放列表。