Admin Interfaceのカスタマイズ

Admin Interfaceのカスタマイズは、大まかに分けて3種類あります。

  • テンプレートのカスタマイズ
  • admin.pyを使用したカスタマイズ
  • フォームをメインとしたカスタマイズ

です。


フォームをメインとしたカスタマイズはcanadian-payroll-calculatorのpayrollアプリのソースを読めばわかると思います。
勉強用にUserモデルを継承したProfileアプリを作成したいと思います。


注意

  • Djangoの開発版で作成しています。
  • settings.py, urls.pyの設定は省略します。

まずはmodels.pyから。

from django.db import models
from django.contrib.auth import models as authModel

class Profile(authModel.User):
    mobile_mail = models.CharField(max_length = 100, blank = True, null = True)
    zip = models.CharField(max_length = 20, blank = True, null = True)
    address1 = models.CharField(max_length = 100, blank = True, null = True)
    address2 = models.CharField(max_length = 100, blank = True, null = True)
    address3 = models.CharField(max_length = 100, blank = True, null = True)

    def __unicode__(self):
        return "%s %s" % (self.first_name, self.last_name)

これに対してsyncdbを実行します。
次にAdmin Interfaceで使えるようにadmin.pyを作成します。

from django.contrib import admin
from models import Profile

class ProfileAdmin(admin.ModelAdmin):
    pass

admin.site.register(Profile, ProfileAdmin)

これでAdmin InterfaceからProfileを見ることができます。
AdminCustomize01
posted by (C)常山
必要な項目のみ表示するようにこのページをカスタマイズしていきます。
表示項目が

  • user_name
  • first_name
  • last_name
  • mail_address
  • mobile_email
  • zip
  • address1
  • address2
  • address3

のforms.pyを作成します。

from django import forms
from models import Profile

class ProfileForm(forms.Form):
    user_name = forms.CharField()
    first_name = forms.CharField()
    last_name = forms.CharField()
    mail_address = forms.CharField()
    mobile_email = forms.CharField(required = False)
    zip = forms.CharField(required = False)
    address1 = forms.CharField(required = False)
    address2 = forms.CharField(required = False)
    address3 = forms.CharField(required = False)

次にadmin.pyを編集します。

from django.contrib import admin
from models import Profile
from forms import ProfileForm
from django.shortcuts import render_to_response
from django.template import RequestContext

class ProfileAdmin(admin.ModelAdmin):
    def add_view(self, request, form_url = '', extra_context = None):
        model = self.model
        opts = model._meta

        if request.method == 'GET':
            initial = None
            form = ProfileForm(initial = initial)
        return render_to_response('admin/testapp/add_form.html',
                                    {
                                        "title": "TestForm",
                                        "form": form,
                                        "is_popup": request.REQUEST.has_key('_popup'),
                                        "add": True,
                                        "change": True,
                                        "has_add_permission": True,
                                        "has_delete_permission": True,
                                        "has_change_permission": True,
                                        "has_file_field": False,
                                        "has_absolute_uri": False,
                                        "auto_populated_fields": (),
                                        "opts": opts,
                                        "save_as": False,
                                        "root_path": self.admin_site.root_path,
                                        "app_label": self.model._meta.app_label,
                                    }, context_instance = RequestContext(request)
    )

admin.site.register(Profile, ProfileAdmin)

次にrender_to_responseで指定したPath(admin/testapp/add_form.html)に以下のテンプレートを置きます。

{% extends "admin/change_form.html" %}
{% load i18n %}

{% block after_field_sets %}
<fieldset class="module aligned">
    <table>
        <tbody>
            {{ form.as_table }}
        </tbody>
    </table>
</fieldset>
{% endblock %}

そしてアクセスしてみると以下のような画面になります。
AdminCustomize02
posted by (C)常山
上記のソースはフォームを表示させるだけの不完全なものです。
canadian-payroll-calculatorを参考にすればAdmin Interfaceに作成したアプリケーションを埋め込むことが可能ではないでしょうか。


間違い等ございましたら指摘してください。