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を見ることができます。
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 %}
そしてアクセスしてみると以下のような画面になります。
posted by (C)常山
上記のソースはフォームを表示させるだけの不完全なものです。
canadian-payroll-calculatorを参考にすればAdmin Interfaceに作成したアプリケーションを埋め込むことが可能ではないでしょうか。
間違い等ございましたら指摘してください。