Admin siteでmodelを複数に分割して管理する
Admin siteを便利に使いたい
Admin siteでmodelのデータを予めある程度分類できたら便利だと思いませんか。
django.contrib.auth.models.Userを使って試したいと思います。
仕様
- Django 1.1以降のバージョンをインストールしてあること。
ユーザ作成
ユーザは以下の設定とします。
- test1は is_staff = True, is_superuser = True
- test2は is_staff = True, is_superuser = False
- test3は is_staff = False, is_superuser = False
admin.py作成
querysetを利用すれば表示するデータを制御できます。
admin.py
from django.contrib import admin
from django.contrib.auth.admin import UserAdmin
from django.contrib.auth.models import User
from django.db.models import Q
class StaffAdmin(UserAdmin):
def queryset(self, request):
qs = super(UserAdmin, self).queryset(request)
qs = qs.filter(Q(is_staff = True) | Q(is_superuser = True))
return qs
class CustomerAdmin(StaffAdmin):
def queryset(self, request):
qs = super(UserAdmin, self).queryset(request)
qs = qs.exclude(Q(is_staff = True) | Q(is_superuser = True))
return qs
admin.site.unregister(User)
admin.site.register(User, StaffAdmin)
admin.site.register(User, CustomerAdmin)
このままではAlreadyRegisteredというエラーで使用することが出来ません。
proxy models
AlreadyRegisteredエラーを回避するために、Django 1.1からの新機能proxy modelsを使用します。
models.pyに以下を作成します。
models.py
from django.db import models
from django.contrib.auth.models import User
class Customer(User):
class Meta:
proxy = True
app_label = 'auth'
verbose_name = 'Customer Account'
verbose_name_plural = 'Customer Accounts'
次にadmin.pyを以下のように変更します。
admin.py
from django.contrib import admin
from django.contrib.auth.admin import UserAdmin
from django.contrib.auth.models import User
from django.db.models import Q
from appname.models import Customer
class StaffAdmin(UserAdmin):
def queryset(self, request):
qs = super(UserAdmin, self).queryset(request)
qs = qs.filter(Q(is_staff = True) | Q(is_superuser = True))
return qs
class CustomerAdmin(StaffAdmin):
def queryset(self, request):
qs = super(UserAdmin, self).queryset(request)
qs = qs.exclude(Q(is_staff = True) | Q(is_superuser = True))
return qs
admin.site.unregister(User)
admin.site.register(User, StaffAdmin)
admin.site.register(Customer, CustomerAdmin)
Admin siteは
さらに
このままでは見栄えが悪いのでもう少し修正します。
models.py
from django.db import models
from django.contrib.auth.models import User
class Customer(User):
class Meta:
proxy = True
app_label = 'auth'
verbose_name = 'Customer Account'
verbose_name_plural = 'Customer Accounts'
class Staff(User):
class Meta:
proxy = True
app_label = 'auth'
verbose_name = 'Staff Account'
verbose_name_plural = 'Staff Accounts'
admin.py
from django.contrib import admin
from django.contrib.auth.admin import UserAdmin
from django.contrib.auth.models import User
from django.db.models import Q
from appname.models import Customer, Staff
class StaffAdmin(UserAdmin):
def queryset(self, request):
qs = super(UserAdmin, self).queryset(request)
qs = qs.filter(Q(is_staff = True) | Q(is_superuser = True))
return qs
class CustomerAdmin(StaffAdmin):
def queryset(self, request):
qs = super(UserAdmin, self).queryset(request)
qs = qs.exclude(Q(is_staff = True) | Q(is_superuser = True))
return qs
admin.site.unregister(User)
admin.site.register(Staff, StaffAdmin)
admin.site.register(Customer, CustomerAdmin)
データは、
Staff Accounts
Customer Accounts
これを応用すれば色々なことが出来るのではないでしょうか。



