newforms 是今年 check-in Django subversion repository 的程式庫。看名字就知道,它將會取代舊有的 forms 程式庫。

如今,Django 內有兩組處理 HTML 表單的程式庫,一為 newforms、二為 oldforms。何者為佳?必為 newforms 也。本文簡單描述一下 newforms 程式庫的使用概念。你不可能看完就會寫 newforms 程式,但會發現它真的很簡單!

newforms 程式庫放在 django.newforms 套件中。使用前請

from django import newforms

或是你也可以寫成

from django import newforms as forms

因為現在新舊 forms 程式庫還在過渡期間,我偏好用第一種寫法。這樣,雖然要多打三個字母,但寫程式時便可明確指出用的是 newforms。待未來 newforms 完全取代 oldforms 以後,直接把 newforms 字樣取代為 forms 即可,不會有什麼問題。

newforms 程式庫基本上把表單視作類別來進行定義,這個類別即為 django.newforms.Form 的子類別。在 Form 類別中我們定義類別成員 (而非物件成員) 用作表單欄位,而這些欄位要是 django.newforms.Field 子類別的實體

當 Django 程式要使用表單的時候,它會 (通常是在 view 裡面) 產生一個表單的實體,然後我們把這個表單丟進 template,讓 template 去顯示它。Form 類別提供把物件轉譯成 HTML 碼的方法,所以你在 template 裡簡單用

{{ form.as_table }}

就可以在網頁上顯示定義好的表單了!

使用者填完表單會 submit,在 template 裡我們可以寫為

<form class="input" method="post">
<table class="input">
    {{ form.as_table }}
    <tr><th /><td><input
      class="submit" type="submit" name="modify"
      value="COMMIT" /></td></tr>
</table>
</form>

把資料丟進 HTTP POST 裡,交給 view 來處理 (為了方便,通常我都用同一個 view)

if request.POST:
    form = MyForm(request.POST)
    if not form.errors:
        form.save(blog)
        return HttpResponseRedirect(obj.get_absolute_url())

newforms 提供了方便的三種功能:

  1. validation。如果 validation 失敗的話,form.errors 就不會是空的。
  2. cleaning。從表單接到的資料有時候不一定夠好,更可能根本有問題。如果我們已經知道了可能的狀況,就可以讓 Form 去清理它。
  3. widget。表單也是表現層的一部分!想必沒人會忘記這一點。widget 提供程式員訂製表單外觀的架構,把表單的外觀定義抽到表單的資料定義之外。

在上一段程式的第三行,當程式在存取 form.errors 的時候,form 物件會自動進行 cleaning -> validating 的動作。如果表單資料經過清理了還有問題,form.errors 就不會是空的,我們可以在程式裡進行處理。

處理表單的錯誤也很簡單:把有錯的 form 物件重新塞回 template,form.as_table 方法會很高興地幫我們把錯的地方標出來。如果想要更有彈性地處理表單的錯誤訊息,用毅力照著 as_table 寫個自訂的 render 方法就好了。

newforms 程式庫還提供一些現成的 helper,可以直接從 model 生成 form 物件。從 model 類別或 model 物件都可以作,是 RAD 的最佳選擇。

newforms 的詳細用法和範例請見 http://www.djangoproject.com/documentation/newforms/。讀了本文後,相信你會更快上手 Django newforms。

Posted by yungyuc at 11:33, 0 comment, 0 trackback.
Navigate
Add a trackback
Add a comment

Your name. (required)

Your personal website. (optional)

Your email address. Will not show in page. (suggested, but optional)

Text format is "Plain Text".

Enter "lCSbc"
© hover year to navigate month: powered by django