<rt id="bn8ez"></rt>
<label id="bn8ez"></label>

  • <span id="bn8ez"></span>

    <label id="bn8ez"><meter id="bn8ez"></meter></label>

    Sealyu

    --- 博客已遷移至: http://www.sealyu.com/blog

      BlogJava :: 首頁(yè) :: 新隨筆 :: 聯(lián)系 :: 聚合  :: 管理 ::
      618 隨筆 :: 87 文章 :: 225 評(píng)論 :: 0 Trackbacks
    第一部分: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é)合了PrototypeScript.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è)面上僅需要獲取zip文件,它包含兩個(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.)。

            Firebug
            雖然Firebug不是必須的,但當(dāng)你開始在使用html,CSS和JavaScript混合開發(fā)的時(shí)候,你可以使用它很方便的來查看你所創(chuàng)建網(wǎng)頁(yè)的所有數(shù)據(jù)。Firebug([url]https://addons.mozilla.org/en-US/firefox/addon/1843[/url])是Firefox的一個(gè)插件,它是一個(gè)非常棒的小工具。我實(shí)際上并不怎么使用Firefox-我更喜歡Camino-但我在web編程開發(fā)的時(shí)候一直用它。

            設(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 syncdb
     
            讓我們來確定一下所有的配置到現(xiàn)在都能正常運(yùn)行。首先打開瀏覽器,然后輸入[url]http://127.0.0.1:8000[/url]
    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文件夾中
    cp urls.py 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)目和ajaxapp應(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。
    第三部分:DjangoPrototype:Ajax Request(非對(duì)稱模式發(fā)送數(shù)據(jù))
     
          Ajax另一個(gè)常用的功能是發(fā)送數(shù)據(jù)到服務(wù)器但不強(qiáng)制用戶重新加載他們所在的整個(gè)頁(yè)面。在DjangoAjax教程的第三節(jié)中我們將要向Server發(fā)送Django生成表單的內(nèi)容。(RequestUpater不同之處是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ì)使用PrototypeForm庫(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ā)。此外,我們還使用了PrototypeForm庫(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
        輸入[url]http://127.0.0.1:8000[/url],我們就可以開始提交表單了。
        往表單字段里輸入一些數(shù)據(jù)然后點(diǎn)擊提交按鈕。你將看到所發(fā)出的消息會(huì)從開發(fā)服務(wù)器的終端窗口上被打印出來。
        花一些時(shí)間來多加練習(xí),后面還有第四部分等著你呢。我將在第四部分中介紹使用Scriptaculous來拖放列表。

    posted on 2009-08-29 22:51 seal 閱讀(3964) 評(píng)論(2)  編輯  收藏 所屬分類: Python

    評(píng)論

    # re: Django和Ajax教程(轉(zhuǎn))[未登錄] 2012-08-06 14:32 aa
    fsdfdf  回復(fù)  更多評(píng)論
      

    # re: Django和Ajax教程(轉(zhuǎn)) 2015-11-09 17:01 ~
    good!  回復(fù)  更多評(píng)論
      

    主站蜘蛛池模板: 天堂亚洲国产中文在线| 91视频精品全国免费观看| 99热在线观看免费| 四虎影视永久免费视频观看| 亚洲精品国产免费| 亚洲免费视频一区二区三区| 日韩毛片免费在线观看| 亚洲欧洲日产韩国在线| 日本高清不卡aⅴ免费网站| 免费观看午夜在线欧差毛片| 亚洲人成影院在线高清| 国产成人久久AV免费| 亚洲一区无码精品色| 在线亚洲精品视频| 一本无码人妻在中文字幕免费 | 又粗又黄又猛又爽大片免费| 亚洲午夜一区二区电影院| 国产午夜精品免费一区二区三区| 亚洲AⅤ永久无码精品AA| 亚洲熟妇av午夜无码不卡| 日韩精品免费一级视频| 亚洲av鲁丝一区二区三区| 三级黄色免费观看| 亚洲国产综合精品一区在线播放| 中文字幕无码精品亚洲资源网久久| 久久久精品2019免费观看| 亚洲VA中文字幕不卡无码| aa级女人大片喷水视频免费| 亚洲福利在线播放| 最新亚洲人成无码网www电影| 国产精品免费观看久久| 亚洲免费中文字幕| 亚洲最大免费视频网| 亚洲一区二区中文| 香蕉成人免费看片视频app下载| 亚洲婷婷五月综合狠狠爱| 中文字幕版免费电影网站| 综合久久久久久中文字幕亚洲国产国产综合一区首| 亚洲av最新在线观看网址| 免费高清av一区二区三区| 2020久久精品亚洲热综合一本|