動的なformを作る 3 - 文字列からformオブジェクトを作成する 基本編
formオブジェクトを作成するのに、通常はクラスを記述して作成するのですが、
field名、fieldの種類などを文字列で指定しformオブジェクトを作成できたら便利だと思いませんか?
仕様
- '商品'フィールド(goods)を作成し、CharFieldとします。
- '数量'フィールド(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>