More Related Content Similar to Form libraries Similar to Form libraries (20) More from Atsushi Odagiri More from Atsushi Odagiri (20) Form libraries11. ToscaWidgets / Sprox
● SproxはSQLAlchemyのスキーマからToscaWidgetsのフォームを
作成します
● SQLAlchemyのスキーマ以外のフィールドをフォームに追加した
り、スキーマのフィールドをフォームから削除したりできます。
● formencodeでカスタムバリデータを作成します
● tw.formsでカスタムフィールドを作成します
13. tw2
● ToscaWidgetsの後継
● まだ a4がリリースされたばかり、 発展途上
● SQLAlchemyから自動生成するフォームがある
○ many-to-manyまでは対応できてない
● SQLAlchemyというよりElixirに対応している
15. deform / colander
● colanderはスキーマ定義
● deformはcolanderに対応しているフォームライブラリ
● SQLAlchemyからのスキーマ生成できない
● ウィジェットが豊富
● ajaxとりこみに意欲的
● deferred bindingにより実行時にウィジェットやバリデーションを変
更可能
● テンプレートにchameleon(zope page template)を使っている
● テンプレートをmakoに入れ替えるプロジェクトが進行中
http://deformdemo.repoze.org/
16. Sample Model
SQLAlchemy
● User
○ user_name
○ password
○ user_image
○ groups
● Group
○ name
○ users
○ permissions
● Permission
○ name
○ groups
19. Userフォーム Sprox
class UserForm(AddRecordForm):
__model__ = models.User
__require_fields__ = ['user_name']
__omit_fields__ = ['_password']
__field_order__ = ['user_name', 'password', 'groups']
password = tw.forms.PasswordField('password',
validator=tw.forms.validators.NotEmpty)
21. Userグリッド Sprox
class UserTable(TableBase):
__model__ = models.User
user_table = UserTable(models.DBSession)
class UserTableFiller(TableFiller):
__model__ = models.User
user_table_filler = UserTableFiller(models.DBSession)
user_table(user_table_filler.get_value())
25. Userフォーム FormAlchemy
class UserForm(FieldSet):
def __init__(self, **kw):
super(UserForm, self).__init__(model=User, **kw)
excludes = [self._password]
# 追加フィールド
self.insert_after(self.user_name,
Field('password').password().required())
self.configure(exclude=excludes) # フォーム全体の設定
27. User グリッド FormAlchemy
class UserGrid(Grid):
def __init__(self, **kw):
super(UserGrid, self).__init__(cls=models.User, **kw)
# Edit用のリンク追加
self.append(Field('edit_link', value=lambda u: '<a href="%s/edit"
>Edit</a>' % u.id))
self.configure(readonly=True, exclude=[self._password])
users = models.DBSession.query(models.User).all()
grid = user_grid.bind(users)
31. Userフォーム tw2.sqla
class UserForm(tw2.sqla.DbFormPage):
entity = models.User
class child(tw2.forms.TableForm):
user_name = tw2.forms.TextField(validator=tw2.core.Required)
password = tw2.forms.PasswordField(validator=tw2.core.
Required)
user_image = tw2.forms.FileField()
groups = tw2.sqla.DbSingleSelectField(entity=models.Group)
32. ● SQLAlchemyのスキーマから自動生成する機能が追加されてき
ていますが、使い物になりませんでした。(´・ω・`)
● あと、entityクラスのqueryメソッドを呼ぼうとしたり、Elixirを前提に
しすぎです。
● 遅延評価できるselectウィジェットに複数選択可能なものがなく、
many-to-manyの関連付けに困ります
34. Userフォーム WTForms
def group_factory():
return models.DBSession.query(models.Group)
class UserForm(wtforms.Form):
username = wtforms.TextField('User Name')
password = wtforms.PasswordField('Password')
groups = QuerySelectMultipleField(query_factory=group_factory )
43. colander deffered binding
class Group(c.MappingSchema):
# groupを選択するためのスキーマ
group_id = c.SchemaNode(c.String(),
widget=group_select_widget)
class Groups(c.SequenceSchema):
# groupを複数選択するためのスキーマ
group = Group()
class UserSchema(c.MappingSchema):
......
groups = Groups()
46. User フォーム deform バリデーション
try:
params = form.validate(controls)
except ValidationFailure, e:
e.render()
51. Paste deployでがんばr
[app:deform_static]
use = egg:paste#pkg_resources
egg = deform
resource_name = deform/static
[composite:deform]
use = egg:paste#urlmap
/ = deform_app
/static = deform_static
[pipeline:deform_demo]
pipeline =
egg:repoze.tm2#tm
deform
53. Fanstatic 例
from fanstatic import Fanstatic
from js.jqueryui import jqueryui
@wsgify
def app(request):
jqueryui.need()
return Response(body)
app = Fanstatic(app)
55. Fanstatic 例 実行結果
<html>
<head>
<script type="text/javascript" src="/fanstatic/jquery/jquery.js"
></script>
<script type="text/javascript" src="/fanstatic/jqueryui/ui/jquery-ui.js"
></script>
</head>
<body>
Hello
</body>
</html>
56. 参考
● SQLAlchemy http://www.sqlalchemy.org/
● ToscaWidgets http://toscawidgets.org/
● formencode http://formencode.org/
● Sprox http://sprox.org/
● tw2 http://toscawidgets.org/documentation/tw2.core/
● formalchemy http://docs.formalchemy.org/formalchemy
● fa.jquery http://docs.formalchemy.org/fa.jquery/
● WTForms http://wtforms.simplecodes.com/
● colandar https://docs.pylonsproject.org/projects/colander/dev/
● deform https://docs.pylonsproject.org/projects/deform/dev/
● fanstatic http://www.fanstatic.org/en/0.11.2/index.html