Django Admin 管理ツール

Django は Web ベースの管理ツールを提供します。

Django の自動管理ツールは django.contrib の一部です。プロジェクトの settings.py の INSTALLED_APPS で確認できます:

/HelloWorld/HelloWorld/settings.py ファイルのコード:

INSTALLED_APPS = ( 'django.contrib.admin', 'django.contrib.auth', 'django.contrib.contenttypes', 'django.contrib.sessions', 'django.contrib.messages', 'django.contrib.staticfiles', )

django.contrib は大規模な機能セットであり、Django の基本コードの構成要素です。


管理ツールを有効にする

通常、プロジェクトを生成するときに urls.py で自動的に設定されているため、コメントを外すだけで済みます。

設定項目は次のとおりです:

/HelloWorld/HelloWorld/urls.py ファイルのコード:

# urls.py from django.conf.urls import url from django.contrib import admin urlpatterns = [ url(r'^admin/', admin.site.urls), ]

これらがすべて設定されると、Django 管理ツールを実行できます。


管理ツールを使用する

開発サーバーを起動し、ブラウザで http://127.0.0.1:8000/admin/ にアクセスすると、次のような画面が表示されます:

コマンドを使用して、python manage.py createsuperuserスーパーユーザーを作成します。次のようになります:

# python manage.py createsuperuser
Username (leave blank to use 'root'): admin
Email address: [email protected]
Password:
Password (again):
Superuser created successfully.
[root@solar HelloWorld]#

その後、ユーザー名とパスワードを入力してログインすると、次の画面が表示されます:

admin インターフェースでデータモデルを管理するには、まずそのデータモデルを admin に登録する必要があります。例えば、先ほど TestModel にモデル Test を作成しました。TestModel/admin.py を修正します:

HelloWorld/TestModel/admin.py: ファイルのコード:

from django.contrib import admin from TestModel.models import Test # Register your models here. admin.site.register(Test)

リフレッシュすると、Testmodel データテーブルが表示されます:


複雑なモデル

管理ページの機能は強力で、より複雑なデータモデルを十分に処理できます。

まず TestModel/models.py に、より複雑なデータモデルを追加します:

HelloWorld/TestModel/models.py: ファイルのコード:

from django.db import models # Create your models here. class Test(models.Model): name = models.CharField(max_length=20) class Contact(models.Model): name = models.CharField(max_length=200) age = models.IntegerField(default=0) email = models.EmailField() def __unicode__(self): return self.name class Tag(models.Model): contact = models.ForeignKey(Contact, on_delete=models.CASCADE,) name = models.CharField(max_length=50) def __unicode__(self): return self.name

ここには2つのテーブルがあります。Tag は Contact を外部キーとして持ちます。1つの Contact は複数の Tag に対応できます。

また、これまで見たことのない属性タイプも多数あります。例えば、IntegerField は整数を格納するために使用されます。

TestModel/admin.py で複数のモデルを登録して表示します:

HelloWorld/TestModel/admin.py: ファイルのコード:

from django.contrib import admin from TestModel.models import Test,Contact,Tag # Register your models here. admin.site.register([Test, Contact, Tag])

管理ページをリフレッシュすると、表示結果は次のようになります:

上記の管理ツールを使用すると、複雑なモデル操作を行うことができます。

まだテーブル構造を作成していない場合は、次のコマンドで作成できます:

$ python manage.py makemigrations TestModel  # 让 Django 知道我们在我们的模型有一些变更
$ python manage.py migrate TestModel   # 创建表结构

カスタムフォーム

管理ページをカスタマイズして、デフォルトのページを置き換えることができます。例えば、上記の "add" ページです。name と email の部分だけを表示したい場合。TestModel/admin.py を修正します:

HelloWorld/TestModel/admin.py: ファイルのコード:

from django.contrib import admin from TestModel.models import Test,Contact,Tag # Register your models here. class ContactAdmin(admin.ModelAdmin): fields = ('name', 'email') admin.site.register(Contact, ContactAdmin) admin.site.register([Test, Tag])

上記のコードは ContactAdmin クラスを定義しており、管理ページの表示形式を指定しています。

その中の fields 属性は、表示するフィールドを定義します。

このクラスは Contact データモデルに対応するため、登録するときはそれらを一緒に登録する必要があります。表示結果は次のとおりです:

入力欄をブロックに分けることもでき、各ブロックに独自のフォーマットを定義することもできます。TestModel/admin.py を次のように修正します:

HelloWorld/TestModel/admin.py: ファイルのコード:

from django.contrib import admin from TestModel.models import Test,Contact,Tag # Register your models here. class ContactAdmin(admin.ModelAdmin): fieldsets = ( ['Main',{ 'fields':('name','email'), }], ['Advance',{ 'classes': ('collapse',), # CSS 'fields': ('age',), }] ) admin.site.register(Contact, ContactAdmin) admin.site.register([Test, Tag])

上記のフィールドは Main と Advance の2つの部分に分かれています。classes は、その部分の CSS フォーマットを指定します。ここでは Advance 部分を非表示にします:

Advance 部分の横には展開用の Show ボタンがあり、展開後に Hide をクリックすると非表示にできます。下図のようになります:


インライン(Inline)表示

上記の Contact は Tag の外部キーであるため、外部参照の関係があります。

一方、デフォルトのページ表示では両者が分離されており、両者の従属関係を表現できません。インライン表示を使用すると、Tag を Contact の編集ページに付随させて表示できます。

TestModel/admin.py を修正します:

HelloWorld/TestModel/admin.py: ファイルのコード:

from django.contrib import admin from TestModel.models import Test,Contact,Tag # Register your models here. class TagInline(admin.TabularInline): model = Tag class ContactAdmin(admin.ModelAdmin): inlines = [TagInline] # Inline fieldsets = ( ['Main',{ 'fields':('name','email'), }], ['Advance',{ 'classes': ('collapse',), 'fields': ('age',), }] ) admin.site.register(Contact, ContactAdmin) admin.site.register([Test])

表示結果は次のとおりです:


リストページの表示

Contact に数件のレコードを入力すると、Contact のリストページは次のようになります:

このページの表示もカスタマイズできます。例えば、リストにより多くの項目を表示するには、ContactAdmin に list_display 属性を追加するだけです:

HelloWorld/TestModel/admin.py: ファイルのコード:

from django.contrib import admin from TestModel.models import Test,Contact,Tag # Register your models here. class TagInline(admin.TabularInline): model = Tag class ContactAdmin(admin.ModelAdmin): list_display = ('name','age', 'email') # list inlines = [TagInline] # Inline fieldsets = ( ['Main',{ 'fields':('name','email'), }], ['Advance',{ 'classes': ('collapse',), 'fields': ('age',), }] ) admin.site.register(Contact, ContactAdmin) admin.site.register([Test])

ページをリフレッシュすると、表示結果は次のようになります:

検索機能は大量のレコードを管理するときに非常に便利です。search_fields を使用して、このリストページに検索バーを追加できます:

HelloWorld/TestModel/admin.py: ファイルのコード:

from django.contrib import admin from TestModel.models import Test,Contact,Tag # Register your models here. class TagInline(admin.TabularInline): model = Tag class ContactAdmin(admin.ModelAdmin): list_display = ('name','age', 'email') # list search_fields = ('name',) inlines = [TagInline] # Inline fieldsets = ( ['Main',{ 'fields':('name','email'), }], ['Advance',{ 'classes': ('collapse',), 'fields': ('age',), }] ) admin.site.register(Contact, ContactAdmin) admin.site.register([Test])

この例では、name が サンプル のレコードを検索しました。表示結果は次のとおりです:

Django Admin 管理ツールには他にも非常に多くの実用的な機能があります。興味のある方は詳しく調べてみてください。

その他の拡張