formfield_overridesを使ってAdmin siteのwidgetを変更する

Admin siteはオプションがない限りmodelのfieldに対して決まったwidgetとなっています。
そこでAdmin siteでは簡単に別のwidgetに変更したり、独自のwidgetに変更したり出来るオプションがあります。

formfield_overridesを使ってwidgetを変更してみましょう。

model, admin作成

models.py

from django.db import models

class Category(models.Model):
    name = models.CharField(max_length = 100)

    def __unicode__(self):
        return self.name

class Video(models.Model):
    title = models.CharField(max_length = 100)
    author = models.CharField(max_length = 100)
    category = models.ManyToManyField(Category)

    def __unicode__(self):
        return self.title

admin.py

from django.contrib import admin
from appname.models import Video, Category

class VideoAdmin(admin.ModelAdmin):
    pass

class CategoryAdmin(admin.ModelAdmin):
    pass

admin.site.register(Video, VideoAdmin)
admin.site.register(Category, CategoryAdmin)

サンプルデータ作成

Categoryクラスのデータを作成します。

>>>from appname.models import Category
>>>Category(name = 'Comedy').save()
>>>Category(name = 'Action').save()
>>>Category(name = 'Horror').save()

Admin siteを見てみましょう。

formfield_overrides01_01

admin.py変更

複数選択できるリストボックスからCheckboxSelectMultiple widgetに変更してみます。

admin.py

from django.contrib import admin
from appname.models import Video, Category
from django.forms.widgets import CheckboxSelectMultiple

class VideoAdmin(admin.ModelAdmin):
    formfield_overrides = {
        models.ManyToManyField: {'widget': CheckboxSelectMultiple}}

class CategoryAdmin(admin.ModelAdmin):
    pass

admin.site.register(Video, VideoAdmin)
admin.site.register(Category, CategoryAdmin)

変更すると以下のようになります。

formfield_overrides01_02

複数あるfieldを指定した場合は?

サンプルでは、CharFieldが複数あります。
formfield_overridesで指定した場合、どのようになるか試してみましょう。

admin.py

from django.contrib import admin
from appname.models import Video, Category
from django.forms.widgets import CheckboxSelectMultiple, Textarea

class VideoAdmin(admin.ModelAdmin):
    formfield_overrides = {
        models.ManyToManyField: {'widget': CheckboxSelectMultiple},
        models.CharField: {'widget': Textarea}}

class CategoryAdmin(admin.ModelAdmin):
    pass

admin.site.register(Video, VideoAdmin)
admin.site.register(Category, CategoryAdmin)

結果は以下の通りです。

formfield_overrides01_03

formfield_overrides覚えておくと便利です。

twitter 2010-01-09 02:13:21.582447

関連ページ

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編