ModelAdmin
のオプション
ModelAdmin
はとてもフレキシブルなクラスです。このクラスには、 admin イ
ンタフェースをカスタマイズするためのオプションがいくつもあります。オプショ
ンは、全て、 ModelAdmin
のサブクラスで以下のように指定します:
class AuthorAdmin(admin.ModelAdmin):
date_hierarchy = 'pub_date'
-
ModelAdmin.
date_hierarchy
date_hierarchy
をモデルの DateField
や DateTimeField
に指定する
と、変更リストのページに、指定フィールドの日付を使って日付ベースで絞り込み
できるナビゲーションが組み込まれます。
例:
date_hierarchy = 'pub_date'
-
ModelAdmin.
form
デフォルトの設定では、モデルに対して ModelForm
が動的に生成され、追加/
変更ページでフォームを生成するときに使われます。 form
を独自の
ModelForm
と置き換えれば、追加/変更ページのふるまいを変更できます。
詳しくは、 admin にカスタムのバリデーションを追加する を参照してください。
-
ModelAdmin.
fieldsets
admin の「追加 (add)」および「変更 (change)」ページのレイアウトを制御するに
は、 fieldsets
を使います。
fieldsets
は 2 要素のタプルのリストです。各タプルは admin フォームペー
ジ上の <fieldset>
を表します (<fieldset>
はいわばフォームの「セクショ
ン」です)。
フィールドセットは (name, field_options)
の形式をとります。 name
はフィールドセットの名前を表す文字列で、 field_options
はフィールドセッ
ト内で表示したいフィールドの情報を入れた辞書です。この情報の中に、表示した
いフィールドのリストも指定します。
django.contrib.flatpages.FlatPage
モデルから抜き出した例を示します:
class FlatPageAdmin(admin.ModelAdmin):
fieldsets = (
(None, {
'fields': ('url', 'title', 'content', 'sites')
}),
('Advanced options', {
'classes': ('collapse',),
'fields': ('enable_comments', 'registration_required', 'template_name')
}),
)
このフィールドセットによって、 admin のページは以下のようになります:
fieldsets
を指定しない場合、 Django は AutoField
でなく、かつ
editable=True
であるようなフィールドを、モデルに定義した順番に個別のフィー
ルドセットとして表示します。
field_options
辞書には以下のようなキーを指定できます:
-
ModelAdmin.
fields
レイアウトを気にせず、単にモデルの一部のフィールドだけをフォームに表示した
いだけの場合に、 fieldsets
の代わりに使ってください。例えば、
django.contrib.flatpages.FlatPage
モデルの admin フォームの簡単なバージョ
ンを以下のように定義できます:
class FlatPageAdmin(admin.ModelAdmin):
fields = ('url', 'title', 'content')
上の例では、 ‘url’, ‘title’, ‘content’ フィールドだけが順番にフォームに表示
されます。
Note
この fields
オプションと fieldsets
オプションの中の fields
キーとを混同しないでくださいね。
-
ModelAdmin.
exclude
この属性にフィールドの名前のリストを指定すると、指定したフィールドがフォー
ムから除去されます。
例えば、以下のようなモデルがあったとします:
class Author(models.Model):
name = models.CharField(max_length=100)
title = models.CharField(max_length=3)
birth_date = models.DateField(blank=True, null=True)
name
と title
フィールドだけを含む Author
モデルのフォームを
表示したければ、 fields
や exclude
を使って、それぞれ以下のように
定義できます:
class AuthorAdmin(admin.ModelAdmin):
fields = ('name', 'title')
class AuthorAdmin(admin.ModelAdmin):
exclude = ('birth_date',)
Author
モデルは 3 つのフィールド name
, title
, birth_date
しか持たないので、上の 2 つの例は全く同じフィールドを含むフォームを生成しま
す。
-
ModelAdmin.
filter_horizontal
ユーザビリティが紙一重の <select multiple>
の代わりに、気の利いた控えめ
な Javascript の「フィルタ」インタフェースを使います。フィルタインタフェー
スを横並びにして表示させたいフィールドのリストを指定してください。フィルタ
インタフェースを縦並びにしたい場合は filter_vertical
を使ってください。
-
ModelAdmin.
filter_vertical
filter_horizontal
とほぼ同じですが、フィルタインタフェースを縦並びで表
示します。
-
ModelAdmin.
list_display
admin の変更リストページに表示するフィールドを制御するには list_display
を使います。
使い方:
list_display = ('first_name', 'last_name')
list_display
を指定しなければ、 admin サイトは各オブジェクトの
__unicode__()
表現を表示するカラムを一つだけ表示します。
list_display
には 4 通りの設定方法があります:
モデルのフィールド名:
class PersonAdmin(admin.ModelAdmin):
list_display = ('first_name', 'last_name')
モデルインスタンスを引数にとる呼び出し可能オブジェクト:
def upper_case_name(obj):
return "%s %s" % (obj.first_name, obj.last_name).upper()
upper_case_name.short_description = 'Name'
class PersonAdmin(admin.ModelAdmin):
list_display = (upper_case_name,)
ModelAdmin
の属性名を表す文字列。呼び出し可能オブジェクトと同じよ
うに動作します:
class PersonAdmin(admin.ModelAdmin):
list_display = ('upper_case_name',)
def upper_case_name(self, obj):
return "%s %s" % (obj.first_name, obj.last_name).upper()
upper_case_name.short_description = 'Name'
モデルの属性名を表す文字列。ただし、 self
はモデルインスタンスを
表します:
class Person(models.Model):
name = models.CharField(max_length=50)
birthday = models.DateField()
def decade_born_in(self):
return self.birthday.strftime('%Y')[:3] + "0's"
decade_born_in.short_description = 'Birth decade'
class PersonAdmin(admin.ModelAdmin):
list_display = ('name', 'decade_born_in')
list_display
にはいくつか特殊なケースがあります:
フィールドが ForeignKey
の場合、関連づけられているオブジェクトの
__unicode__()
を表示します。
ManyToManyField
フィールドの表示は、テーブルの各行に対して個別に
SQL 文を実行することになってしまうのでサポートしていません。どうして
も表示させたいなら、カスタムメソッドをモデルに実装して、メソッドの名
前を list_display
に追加してください (list_display
へのカスタ
ムメソッドの追加については、後で詳しく説明しています)。
フィールドが BooleanField
や NullBooleanField
の場合、
True
や False
の代りに “オン” や “オフ” を示すアイコンを表示
します。
モデルや ModelAdmin
のメソッド、呼び出し可能オブジェクトの名前を
指定した場合、 Django はデフォルトでメソッドの出力を HTML エスケープ
します。メソッドの出力をエスケープしたくない場合には、メソッドの
allow_tags
属性の値を True
にしてください。
以下に例を示します:
class Person(models.Model):
first_name = models.CharField(max_length=50)
last_name = models.CharField(max_length=50)
color_code = models.CharField(max_length=6)
def colored_name(self):
return '<span style="color: #%s;">%s %s</span>' % (self.color_code, self.first_name, self.last_name)
colored_name.allow_tags = True
class PersonAdmin(admin.ModelAdmin):
list_display = ('first_name', 'last_name', 'colored_name')
True
か False
を返すようなモデルの ModelAdmin
のメソッド、
呼び出し可能オブジェクトの名前を指定した返す場合、メソッドの
boolean
属性を True
に設定しておくと、Django は「オン」や「オ
フ」のアイコンを表示します。
以下に例を示します:
class Person(models.Model):
first_name = models.CharField(max_length=50)
birthday = models.DateField()
def born_in_fifties(self):
return self.birthday.strftime('%Y')[:3] == '195'
born_in_fifties.boolean = True
class PersonAdmin(admin.ModelAdmin):
list_display = ('name', 'born_in_fifties')
__str__()
および __unicode__()
メソッドは他のモデルメソッドと
同じように list_display
に入れられるので、以下のように書いても全
く問題ありません:
list_display = ('__unicode__', 'some_other_field')
通常、 list_display
の要素のうち、実際のデータベースのフィールド
に対応していないものは、変更リストページで並び順を変えるときのカラム
には使えません。 Django はソートをすべてデータベースレベルで行うから
です。
ただし、 list_display
のいずれかの要素が実際にデータベース上のあ
るフィールドを指している場合、 admin_order_field
という属性を使っ
て、 Django にそのことを教えられます。
例を示しましょう:
class Person(models.Model):
first_name = models.CharField(max_length=50)
color_code = models.CharField(max_length=6)
def colored_first_name(self):
return '<span style="color: #%s;">%s</span>' % (self.color_code, self.first_name)
colored_first_name.allow_tags = True
colored_first_name.admin_order_field = 'first_name'
class PersonAdmin(admin.ModelAdmin):
list_display = ('first_name', 'colored_first_name')
この例では、 Django は Admin 上で colored_first_name
を並べ変える
際に first_name
フィールドを使います。
-
ModelAdmin.
list_display_links
list_display_links
を設定すると、 list_display
のどのフィールドを
オブジェクトの「変更」ページにリンクするかを制御できます。
デフォルトでは、変更リストページはオブジェクトの変更ページ中の第一カラム、
すなわち list_display
の先頭に指定したフィールドにリンクを張ります。
list_display_links
を使うと、リンク先のカラムを変更できます。
list_display_links
には、フィールド名のリストまたはタプルを
(list_display
と同じ形式で) 指定します。
list_display_links
に指定するフィールド名は、一つでも複数でも構いません。
フィールド名が list_display
に列挙されている限り、 Django はどんなに多
くの (あるいはどんなにわずかな) フィールドがリンクされていても問題にしませ
ん。必要なのは、 list_display_links
を使うには list_display
を定義
しておかねばならない、ということだけです。
以下の例では、 first_name
および last_name
フィールドが変更リス
トページにリンクされます:
class PersonAdmin(admin.ModelAdmin):
list_display = ('first_name', 'last_name', 'birthday')
list_display_links = ('first_name', 'last_name')
-
ModelAdmin.
list_editable
Set list_editable
to a list of field names on the model which will allow
editing on the change list page. That is, fields listed in list_editable
will be displayed as form widgets on the change list page, allowing users to
edit and save multiple rows at once.
Note
list_editable
interacts with a couple of other options in particular
ways; you should note the following rules:
- Any field in
list_editable
must also be in list_display
. You
can’t edit a field that’s not displayed!
- The same field can’t be listed in both
list_editable
and
list_display_links
– a field can’t be both a form and a link.
You’ll get a validation error if either of these rules are broken.
-
ModelAdmin.
list_filter
admin の変更リストページの右側のサイドバーにあるフィルタを有効にするには、
list_filter
を設定します。この値はフィールド名のリストにします。
各フィールド名は BooleanField
, CharField
, DateField
,
DateTimeField
, IntegerField
, ForeignKey
のいずれかでなければ
なりません。
以下の例は django.contrib.auth.models.User
モデルからとったもので、
list_display
と list_filter
の仕組みを示しています:
class UserAdmin(admin.ModelAdmin):
list_display = ('username', 'email', 'first_name', 'last_name', 'is_staff')
list_filter = ('is_staff', 'is_superuser')
上のコードによって、 admin の変更リストは以下のようになります:
(この例では、後述の search_fields
も定義しています。)
-
ModelAdmin.
list_per_page
admin 変更リストをページ分割 (paginate) で表示するときに、各ページに何個の
アイテムを表示するかを決めます。デフォルト値は 100
です。
-
ModelAdmin.
list_select_related
list_select_related
を設定すると、 admin の変更リストページに表示するオ
ブジェクトリストを取得する際に select_related()
を使うよう Django に指
示できます。これにより、データベースクエリの発行数を抑えられます。
値は True
または False
にします。デフォルトは False
です。
list_display
のいずれかのフィールドが ForeignKey
の場合、 Django は
この設定に関わらず select_related()
を使います。
select_related()
の詳細は
select_related() のドキュメント を参照してください。
-
ModelAdmin.
inlines
後述の InlineModelAdmin
を参照してください。
-
ModelAdmin.
ordering
ordering
を設定すると、 admin の変更リストにおける整列順を指定できます。
値はタプルからなるリストで、モデルの ordering
パラメタと同じ形式で指定
します。
この値を指定しない場合、 Django はモデルのデフォルトの整列順を使います。
Note
Django はリストやタプルの最初の要素だけを考慮して、後の要素は無視します。
-
ModelAdmin.
prepopulated_fields
フィールドの値を別のフィールドの値からセットさせたい場合は、以下のように、
prepopulated_fields
にフィールド名を対応付けた辞書を設定してください:
class ArticleAdmin(admin.ModelAdmin):
prepopulated_fields = {"slug": ("title",)}
prepopulated_fields
をセットすると、フィールドに小さな JavaScript のア
クションが設定され、引数に指定したフィールドから値を自動的に取り込みます。
prepopulated_fields
は、主に他の複数のフィールドから SlugField
フィー
ルドの値を生成するときに使います。値は、まず各ソースフィールドの値を結合し
て、その結果が有効なスラグになるよう変換 (スペースをダッシュに置換するなど)
して生成します。
DateTimeField
, ForeignKey
および ManyToManyField
は
prepopulated_fields
に指定できません。
-
ModelAdmin.
radio_fields
デフォルトでは、Django の admin は ForeignKey
のフィールドや
choices
の設定されたフィールドに対してセレクタボックス (<select>) イン
タフェースを使います。 radio_fields
にフィールド名を指定しておくと、
Django はセレクタボックスの代りにラジオボタンのインタフェースを使います。
例えば、 group
が Person
モデル上の ForeignKey
フィールド
であれば、以下のように書けます:
class PersonAdmin(admin.ModelAdmin):
radio_fields = {"group": admin.VERTICAL}
ラジオボタンの並び方を指定するシンボル、 HORIZONTAL
または VERTICAL
は django.contrib.admin
モジュールにあります。
ForeignKey
や choices
パラメタのセットされたフィールド以外に
radio_fields
を使ってはなりません。
-
ModelAdmin.
raw_id_fields
デフォルトでは、Django の admin サイトは ForeignKey
フィールドに対して
セレクタボックス (<select>) インタフェースを使います。しかし、時にはリレー
ション先の全てのオブジェクトの入ったセレクタボックスが生成され、ドロップダ
ウン表示されるのを避けたい場合もあります。
raw_id_fields
には、ウィジェットを Input
に変更したいフィールドのリ
ストを指定します。 ForeignKey
または ManyToManyField
を指定できます:
class ArticleAdmin(admin.ModelAdmin):
raw_id_fields = ("newspaper",)
-
ModelAdmin.
save_as
save_as
を指定すると、 admin の編集フォームで「別名で保存 (save as)」機
能を使えるようになります。
通常、編集フォームには三つの保存オプション、すなわち「保存 (Save)」、「保存
して編集を続ける (Save and continue editing)」、「保存してもう一つ追加
(Save and add another)」があります。 save_as
を True
にすると「保存
してもう一つ追加」は「別名で保存 (Save as)」に置き換わります。
「別名で保存」は、現在のオブジェクトをそのまま保存するのではなく、(新たな
ID を持った) 別のオブジェクトとして保存することです。
デフォルトでは、 save_as
は False
に設定されています。
-
ModelAdmin.
save_on_top
save_on_top
を指定すると、 admin の変更フォームの最上部に保存ボタンを追
加できます。
通常、保存ボタンはフォームの最下部だけに表示されます。 save_on_top
を指
定すると、ボタンは最下部だけでなく最上部にも表示されます。
デフォルトでは、 save_on_top
は False
です。
-
ModelAdmin.
search_fields
search_fields
を指定すると、 admin の変更リストページで検索ボックスを使
えるようになります。この値は、ユーザが検索クエリをテキストボックスに入力し
たときに検索の対象に含めるフィールド名のリストです。
フィールドは CharField
や TextField
のような何らかのテキストフィー
ルドでなければなりません。 DB API の「リレーションを追跡する」表記を使えば、
ForeignKey
を介したフィールドの指定も行えます:
search_fields = ['foreign_key__related_fieldname']
admin の検索ボックスで検索を実行すると、 Django は検索クエリを単語に分解し
て、各単語を含むような全てのオブジェクトを返します。検索は大小文字を区別せ
ず、 search_fields
に指定したフィールドのうち少なくとも一つに単語が入っ
ていればヒットします。例えば、 search_fields
が
['first_name', 'last_name']
に設定されている場合、ユーザが
john lennon
を検索すると、 Django は以下のような WHERE
節を持った
SQL と等価な検索を実行します:
WHERE (first_name ILIKE '%john%' OR last_name ILIKE '%john%')
AND (first_name ILIKE '%lennon%' OR last_name ILIKE '%lennon%')
より高速な、あるいはより制約の厳しい検索を行うには、フィールド名の前に以下
のような演算子を置きます:
^
フィールドの先頭にマッチします。例えば、 search_fields
を
['^first_name', '^last_name']
にして、ユーザが john lennon
を検
索した場合、Django は以下のような WHERE
節の SQL に等価な検索を実行
します:
WHERE (first_name ILIKE 'john%' OR last_name ILIKE 'john%')
AND (first_name ILIKE 'lennon%' OR last_name ILIKE 'lennon%')
このクエリを使うと、データベースはカラムの先頭部分だけをチェックすれば
よく、カラム中のデータ全体を調べなくてもよくなるため、通常の
'%john%'
クエリよりも効率的に検索を実行できます。加えて、カラムにイ
ンデクスが設定されていれば、データベースによっては LIKE
クエリであっ
てもインデクスを使ったクエリを実行できるという利点があります。
=
大小文字を区別しない厳密一致です。例えば、 search_fields
を
['=first_name', '=last_name']
にして、ユーザが john lennon
を検
索した場合、 Django は以下のような WHERE
節の SQL に等価な検索を実行
します:
WHERE (first_name ILIKE 'john' OR last_name ILIKE 'john')
AND (first_name ILIKE 'lennon' OR last_name ILIKE 'lennon')
クエリ入力はスペース区切りなので、この例に従うと、 first_name
が
'john winston'
である (スペースを含む) ようなレコードは検索でき
ないので注意してください。
@
- 全文検索マッチを実行します。デフォルトの search メソッドに似ていますが、
インデクスを使います。現在のところ MySQL でしか使えません。
-
ModelAdmin.
formfield_overrides
This provides a quick-and-dirty way to override some of the
Field
options for use in the admin.
formfield_overrides
is a dictionary mapping a field class to a dict of
arguments to pass to the field at construction time.
Since that’s a bit abstract, let’s look at a concrete example. The most common
use of formfield_overrides
is to add a custom widget for a certain type of
field. So, imagine we’ve written a RichTextEditorWidget
that we’d like to
use for large text fields instead of the default <textarea>
. Here’s how we’d
do that:
from django.db import models
from django.contrib import admin
# Import our custom widget and our model from where they're defined
from myapp.widgets import RichTextEditorWidget
from myapp.models import MyModel
class MyModelAdmin(admin.ModelAdmin):
formfield_overrides = {
models.TextField: {'widget': RichTextEditorWidget},
}
Note that the key in the dictionary is the actual field class, not a string.
The value is another dictionary; these arguments will be passed to
__init__()
. See フォーム API for details.
Warning
If you want to use a custom widget with a relation field (i.e.
ForeignKey
or
ManyToManyField
), make sure you haven’t included
that field’s name in raw_id_fields
or radio_fields
.
formfield_overrides
won’t let you change the widget on relation fields
that have raw_id_fields
or radio_fields
set. That’s because
raw_id_fields
and radio_fields
imply custom widgets of their own.
-
ModelAdmin.
actions
A list of actions to make available on the change list page. See
Admin actions for details.
-
ModelAdmin.
actions_on_top
-
ModelAdmin.
actions_on_bottom
Controls where on the page the actions bar appears. By default, the admin
changelist displays actions at the top of the page (actions_on_top = True;
actions_on_bottom = False
).
-
ModelAdmin.
change_list_template
Path to a custom template that will be used by the model objects “change list”
view. Templates can override or extend base admin templates as described in
Overriding Admin Templates.
If you don’t specify this attribute, a default template shipped with Django
that provides the standard appearance is used.
-
ModelAdmin.
change_form_template
Path to a custom template that will be used by both the model object creation
and change views. Templates can override or extend base admin templates as
described in Overriding Admin Templates.
If you don’t specify this attribute, a default template shipped with Django
that provides the standard appearance is used.
-
ModelAdmin.
object_history_template
Path to a custom template that will be used by the model object change history
display view. Templates can override or extend base admin templates as
described in Overriding Admin Templates.
If you don’t specify this attribute, a default template shipped with Django
that provides the standard appearance is used.
-
ModelAdmin.
delete_confirmation_template
Path to a custom template that will be used by the view responsible of showing
the confirmation page when the user decides to delete one or more model
objects. Templates can override or extend base admin templates as described in
Overriding Admin Templates.
If you don’t specify this attribute, a default template shipped with Django
that provides the standard appearance is used.
ModelAdmin
のメソッド
-
ModelAdmin.
save_model
(self, request, obj, form, change)
save_model
メソッドは HttpRequest
, モデルインスタンス、
ModelForm
インスタンス、オブジェクトの追加か変更かを表すブール値 (変更
の場合には True
) を引数にとります。このメソッドを使えば、オブジェクトの
保存前 (pre-save) および保存後 (post-save) 処理を実行できます。
保存前に request.user
をオブジェクトに保存するには、以下のようにします:
class ArticleAdmin(admin.ModelAdmin):
def save_model(self, request, obj, form, change):
obj.user = request.user
obj.save()
-
ModelAdmin.
save_formset
(self, request, form, formset, change)
save_formset
メソッドは HttpRequest
, モデルインスタンス、親クラスの
ModelForm
インスタンス、オブジェクトの追加か変更かを表すブール値 (変更
の場合には True
) を引数にとります。
フォームセットの各モデルインスタンスの保存前に request.user
をオブジェ
クトに保存するには、以下のようにします:
class ArticleAdmin(admin.ModelAdmin):
def save_formset(self, request, form, formset, change):
instances = formset.save(commit=False)
for instance in instances:
instance.user = request.user
instance.save()
formset.save_m2m()
-
ModelAdmin.
get_urls
(self)
The get_urls
method on a ModelAdmin
returns the URLs to be used for
that ModelAdmin in the same way as a URLconf. Therefore you can extend them as
documented in URL ディスパッチャ:
class MyModelAdmin(admin.ModelAdmin):
def get_urls(self):
urls = super(MyModelAdmin, self).get_urls()
my_urls = patterns('',
(r'^my_view/$', self.my_view)
)
return my_urls + urls
Note
Notice that the custom patterns are included before the regular admin
URLs: the admin URL patterns are very permissive and will match nearly
anything, so you’ll usually want to prepend your custom URLs to the built-in
ones.
However, the self.my_view
function registered above suffers from two
problems:
- It will not perform and permission checks, so it will be accessible to
the general public.
- It will not provide any header details to prevent caching. This means if
the page retrieves data from the database, and caching middleware is
active, the page could show outdated information.
Since this is usually not what you want, Django provides a convenience wrapper
to check permissions and mark the view as non-cacheable. This wrapper is
AdminSite.admin_view()
(i.e. self.admin_site.admin_view
inside a
ModelAdmin
instance); use it like so:
class MyModelAdmin(admin.ModelAdmin):
def get_urls(self):
urls = super(MyModelAdmin, self).get_urls()
my_urls = patterns('',
(r'^my_view/$', self.admin_site.admin_view(self.my_view))
)
return my_urls + urls
Notice the wrapped view in the fifth line above:
(r'^my_view/$', self.admin_site.admin_view(self.my_view))
This wrapping will protect self.my_view
from unauthorized access and will
apply the django.views.decorators.cache.never_cache
decorator to make sure
it is not cached if the cache middleware is active.
If the page is cacheable, but you still want the permission check to be performed,
you can pass a cacheable=True
argument to AdminSite.admin_view()
:
(r'^my_view/$', self.admin_site.admin_view(self.my_view, cacheable=True))
-
ModelAdmin.
formfield_for_foreignkey
(self, db_field, request, **kwargs)
The formfield_for_foreignkey
method on a ModelAdmin
allows you to
override the default formfield for a foreign key field. For example, to
return a subset of objects for this foreign key field based on the user:
class MyModelAdmin(admin.ModelAdmin):
def formfield_for_foreignkey(self, db_field, request, **kwargs):
if db_field.name == "car":
kwargs["queryset"] = Car.objects.filter(owner=request.user)
return db_field.formfield(**kwargs)
return super(MyModelAdmin, self).formfield_for_foreignkey(db_field, request, **kwargs)
This uses the HttpRequest
instance to filter the Car
foreign key field
to only the cars owned by the User
instance.
Other methods
-
ModelAdmin.
add_view
(self, request, form_url='', extra_context=None)
Django view for the model instance addition page. See note below.
-
ModelAdmin.
change_view
(self, request, object_id, extra_context=None)
Django view for the model instance edition page. See note below.
-
ModelAdmin.
changelist_view
(self, request, extra_context=None)
Django view for the model instances change list/actions page. See note below.
-
ModelAdmin.
delete_view
(self, request, object_id, extra_context=None)
Django view for the model instance(s) deletion confirmation page. See note below.
-
ModelAdmin.
history_view
(self, request, object_id, extra_context=None)
Django view for the page that shows the modification history for a given model
instance.
Unlike the hook-type ModelAdmin
methods detailed in the previous section,
these five methods are in reality designed to be invoked as Django views from
the admin application URL dispatching handler to render the pages that deal
with model instances CRUD operations. As a result, completely overriding these
methods will significantly change the behavior of the admin application.
One comon reason for overriding these methods is to augment the context data
that is provided to the template that renders the view. In the following
example, the change view is overridden so that the rendered template is
provided some extra mapping data that would not otherwise be available:
class MyModelAdmin(admin.ModelAdmin):
# A template for a very customized change view:
change_form_template = 'admin/myapp/extras/openstreetmap_change_form.html'
def get_osm_info(self):
# ...
def change_view(self, request, object_id, extra_context=None):
my_context = {
'osm_data': self.get_osm_info(),
}
return super(MyModelAdmin, self).change_view(request, object_id,
extra_context=my_context)