More Related Content
PDF
PDF
プロダクトに 1 から Vue.js を導入した話 PDF
Vue.jsの関連ツール・ライブラリ(Vuex, Vue-Router, Nuxt) PDF
From Swing to JavaFX - SwingからJavaFXへのマイグレーションガイド PDF
Nuxt なしで Vue App 作る時に乗り越えるべき5つの壁 PDF
はじめよう JavaFX 2.x(第3回 岡山Javaユーザー会) PPTX
PDF
What's hot
PDF
PPTX
PPTX
PDF
PPT
PPT
PDF
JavaFX 2.0 - リッチクライアントのためのUI基盤 PPTX
PPTX
PPTX
Windows ストアアプリのgrid viewを入門してみた PDF
Featuring Project Silk & Liike: 楽しい "モダン" Web 開発のちょっとディープなお話 PDF
PDF
PDF
React で CSS カプセル化の可能性を考える PDF
What's New in MySQL 5.7 Optimizer @MySQL User Conference Tokyo 2015 PDF
Componentization with Gilgamesh PDF
PDF
0406web creators night_DeNA PDF
PDF
第1回 Magento Cafe Plus Kansai ~ Magentoカスタマイズ入門 Similar to Form libraries
PDF
PPT
PDF
PDF
PlaySQLAlchemyORM2017.key KEY
PDF
PDF
More from Atsushi Odagiri
PDF
みんなのPython勉強会#77 パッケージングしよう PDF
async/await の向こう側 PyCon Kyushu 2022 PDF
パッケージングの呼び声 Python Charity Talks in Japan 2021.02 PDF
eggとはなんだったのか 栄光のsetuptools PDF
pyconjp 2019 LT 今日のsetuptools PDF
Pythonでの開発を効率的に進めるためのツール設定 PDF
PDF
PDF
パッケージングを支える技術 pyconjp2016 PDF
PPTX
PDF
PDF
PDF
PDF
PDF
Pyconjp2012 memory-of-europython PDF
What makes pyramid unique PDF
PDF
PDF
Form libraries
- 1.
- 2.
- 3.
- 4.
- 5.
- 6.
- 7.
- 8.
- 9.
- 10.
- 11.
ToscaWidgets / Sprox
●SproxはSQLAlchemyのスキーマからToscaWidgetsのフォームを
作成します
● SQLAlchemyのスキーマ以外のフィールドをフォームに追加した
り、スキーマのフィールドをフォームから削除したりできます。
● formencodeでカスタムバリデータを作成します
● tw.formsでカスタムフィールドを作成します
- 12.
- 13.
- 14.
- 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
- 18.
- 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())
- 23.
- 24.
- 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
classUserGrid(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)
- 29.
- 30.
- 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の関連付けに困ります
- 33.
- 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 )
- 35.
- 36.
- 38.
- 39.
- 40.
- 42.
- 43.
colander deffered binding
classGroup(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()
- 44.
- 46.
User フォーム deformバリデーション
try:
params = form.validate(controls)
except ValidationFailure, e:
e.render()
- 47.
- 48.
- 49.
- 50.
- 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
- 52.
- 53.
Fanstatic 例
from fanstaticimport Fanstatic
from js.jqueryui import jqueryui
@wsgify
def app(request):
jqueryui.need()
return Response(body)
app = Fanstatic(app)
- 54.
- 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