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を見てみましょう。
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)
変更すると以下のようになります。
複数ある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_overrides覚えておくと便利です。


