ModelFormのwidget.attrsのみ変更する方法

857 views
Skip to first unread message

ツチダ

unread,
Feb 14, 2012, 9:06:02 AM2/14/12
to django-ja
はじめまして。ツチダと申します。よろしくお願いします。

Python 2.6.6、Django 1.3.1を使用しています。
DjangoのModelFormが大変便利だと感じ使っているのですが、例えばテキストインプットのsizeだけ変更したい場合等は、フィールドの再
定義が冗長ではないかと感じており、うまい方法がないか探しています。

class Person(models.Model):
name = models.CharField(u'名前', max_length=255)

class PersonForm(forms.ModelForm):
name = forms.CharField(label=u'名前',
widget=forms.TextInput(attrs={'size':'40'})
class Meta:
model = Person

せっかくDjango側で、Personモデルのnameフィールドの定義に合わせてPersonFormのラベルやフィールドタイプ、ウィジットをデ
フォルト定義してくれるので、それをほぼ同じ内容で上書きするのはあまりスマートでは無いかなと思い下記のようなコードを書いてみました。

class PersonForm(forms.ModelForm):
def __init__(self, *args, **kwargs):
super(PersonForm, self).__init__(*args, **kwargs)
self.fields['name'].widget.attrs.update({'size':'40'})
class Meta:
model = Person

一応私の環境では動いてはいるのですが、ちょっと力技すぎるのではないか、動かないケースがあるのではないか、もっと正しい(?)手続き方法があるので
はないかと思っているのですが、良い方法は無いでしょうか。

Python歴が短く、説明やコードに不足・不備がありましたら指摘してもらえると助かります。

tokibito

unread,
Feb 15, 2012, 10:23:43 AM2/15/12
to django-ja
岡野です。

ModelFormクラスを継承する場合、Metaインナークラスのほうでwidgetsというオプションを指定することにより、ウィジェットを差し替
えられます。

https://docs.djangoproject.com/en/dev/topics/forms/modelforms/#overriding-the-default-field-types-or-widgets

class PersonForm(forms.ModelForm):
class Meta:
model = Person
widgets = {'name': forms.TextInput(attrs={'size':'40'})}
Reply all
Reply to author
Forward
0 new messages