Django 的 Form 真的很好用。

Django 的 Form 表单真的很好用,完全把以往繁琐的表单操作完全抽象出来,成了一个独立的组件。

该系统的最大特色就是与模板无关,表单元素完全在一个文件里就可以定义好,以后也可以随时扩充,修改,很方便。

为了使用富文本编辑器我还使用了 InPlaceEditor,之所以用它是因为它基于强大的 TinyMCE 编辑器,同时提供了很好的 Ajax 支持,为了使用它我还使用了 django-tinymce,这个东西理论上应该找不到编译好的包,可以用 easy_install 安装(在 Fedora 10 里的 python-setuptools-devel 包里),总之就是怎么方便怎么来啦。 :-)

OK, Let&aposs get start it.

在 app 目录里建立一个 forms 的目录,touch 一个 __init__.py,然后在其中写下 newapp.py 文件,如下内容:

from django import forms
from tinymce.widgets import TinyMCE

TYPE_CHOICES = [
[1, &aposDesktop Computer&apos],
[2, &aposLaptop&apos],
]

class NewProduct(forms.Form):
name = forms.CharField()
type_id = forms.ChoiceField(choices=TYPE_CHOICES)
description = forms.CharField(widget=TinyMCE(mce_attrs={})

添加 View 里某个方法(比如 index)填上:

def index(request):
    from testproject.app.forms.newapp import NewProduct
    new_form = NewProduct()
    return render_to_response(&apostestform.html&apos, { &aposnew_form&apos : new_form })

然后改模板,类似如下:

<!DOCTYPE HTML PUBLIC "-//W3C//DTD XHTML 1.01//EN">
<html lang="en">
<head>
    <title>New Product</title>
</head>
<body>
   <h1>New Product</h1>
   <form action="." method="POST">
        {{ new_form.as_table }}
     <p><input type="submit" value="Submit"></p>
    </form>
</body>
</html>

够好用吧?一个 form 定义好以后直接使用 as_table 方法就可以转换成表格。

如果需要更多自定义参数,也可以像访问数据库一样直接调用 form class 里的属性,如下:

<!DOCTYPE HTML PUBLIC "-//W3C//DTD XHTML 1.01//EN">
<html lang="en">
<head>
    <title>New Product</title>
</head>
<body>
   <h1>New Product</h1>
   <form action="." method="POST">
        {{ new_form.name }}
        {{ new_form.type_id }}
        {{ new_form.description }}
     <p><input type="submit" value="Submit"></p>
    </form>
</body>
</html>
 

在 Django 的官方教程里,设计一个 form class 的 ChoiceField 使用的是 Tuple,而我这里经过试验,List 也是可以的,而之所以使用 List,是因为这样可以通过数据库,向 ChoiceField 里添加数据,如:

from django import forms
from tinymce.widgets import TinyMCE
from testproject.app.models import ProductTypes

types = ProductTypes.objects.all()
TYPE_CHOICES = []
for type in types:
TYPE_CHOICES.append([type.id, type.name])

class NewProduct(forms.Form):
name = forms.CharField()
type_id = forms.ChoiceField(choices=TYPE_CHOICES)
description = forms.CharField(widget=TinyMCE(mce_attrs={})

嘿嘿,基本到此,还是比较简单的,附带一个我的 TinyMCE 的设置作为结尾好了。

from django import forms
from tinymce.widgets import TinyMCE
from testproject.app.models import ProductTypes

types = ProductTypes.objects.all()
TYPE_CHOICES = []
for type in types:
TYPE_CHOICES.append([type.id, type.name])

class NewProduct(forms.Form):
name = forms.CharField()
type_id = forms.ChoiceField(choices=TYPE_CHOICES)
description = forms.CharField(widget=TinyMCE(mce_attrs={&apostheme&apos : &quotadvanced&quot,
&aposskin&apos : &quoto2k7&quot,
&aposskin_variant&apos : &quotsilver&quot,
&aposelements&apos : &aposelm3&apos,
&aposmode&apos : &apostextareas&apos,
&apostheme_advanced_toolbar_location&apos : &quottop&quot,
&apostheme_advanced_toolbar_align&apos : &quotleft&quot,
&apostheme_advanced_resizing&apos : &apostrue&apos,
&aposplugins&apos : &quotsafari,pagebreak,style,layer,save,iespell,xhtmlxtras&quot,
&apostheme_advanced_buttons1&apos : &quotfontselect,fontsizeselect,|,cut,copy,paste,pastetext,|,bullist,numlist,|,undo,redo,|,link,unlink&quot,
&apostheme_advanced_buttons2&apos : &quot&quot,
&apostheme_advanced_buttons3&apos : &quot&quot,
})

不知道 Rails 或者其它 Web Framework 是否也有比较优秀的特色功能,希望也能有人能够介绍一下。

版权所有丨转载请注明出处:https://kxq.io/archives/django的form真的很好用