動的なformを作る 3 - 文字列からformオブジェクトを作成する 基本編

formオブジェクトを作成するのに、通常はクラスを記述して作成するのですが、
field名、fieldの種類などを文字列で指定しformオブジェクトを作成できたら便利だと思いませんか?

仕様

  1. '商品'フィールド(goods)を作成し、CharFieldとします。
  2. '数量'フィールド(quantity)を作成し、IntegerFieldとします。

上記のfieldを持つ'SampleForm'という名前のformを作成します。
classでいうと、

from django import forms

class SampleForm(forms.Form):
    goods = forms.CharField()
    quantity = forms.IntegerField()

となります。

下準備

下準備として、moduleの文字列とmoduleをインポートする関数を作成します。

>>>FORM = 'django.forms'
>>>def mod_import(name):
>>>    mod = __import__(name)
>>>    components = name.split('.')
>>>    for comp in components[1:]:
>>>        mod = getattr(mod, comp)
>>>    return mod

fieldの作成

'goods'のfieldを作成します。

>>>form = mod_import(FORM)
>>>f = getattr(form, 'CharField')
>>>f1 = f()
>>>f1.label = u'商品'

次に'quantity'のfieldを作成します。

>>>f = getattr(form, 'IntegerField')
>>>f2 = f()
>>>f2.label = u'数量'

formオブジェクト作成

>>>fields = {'goods': f1, 'quantity': f2}
>>>sf = type('SampleForm', (getattr(form, 'BaseForm')), {'base_fields': fields})

これでformオブジェクトが作成されました。

HTML出力

作成したformオブジェクトをHTMLで表示してみます。

>>>SF = sf()
>>>SF.as_p()

以下が出力されたHTMLです。

<p><label for="id_goods">商品:</label>
    <input type="text" name="goods" id="id_goods" /></p>\n
<p><label for="id_quantity">数量:</label>
    <input type="text" name="quantity" id="id_quantity" /></p>
twitter 2009-10-29 19:34:50.051605

関連ページ

Recent Updates

URLConf Tip 01 - キャプチャの有無にかかわらず同一のviewで処理する
Markdownの入力補助"wmd"をAdmin siteで使う
ModelFormでfieldのwidgetを変更する
動的なformを作る 6 - Dynamic Inline Admin site編
Formsetsを使う3 - inlineformset_factory編
動的なformを作る 5 - django-dynamic-formset編
Formクラスからメディアを定義する
複数のmodelを結合する 2 - Proxy model編
複数のmodelを結合する 1
ModelFormでfieldの表示順番を変える
Admin siteのwidgetを個別に変更する
formfield_overridesを使ってAdmin siteのwidgetを変更する
Admin siteのlist_displayをカスタマイズする - リンク編
Admin siteのlist_displayをカスタマイズする - 基本編
Admin siteのTextareaの高さを自在に変更する - admin.py編