class
ProfileAdmin(admin.ModelAdmin):
#Admin 専用のページをカスタマイズしたい場合はここでパスを設定できる。(ちなみにこのパスはデフォルトのパスなので、本来は設定なしで change_form.html を読み込みます)
change_form_template = 'admin/prof/profile/change_form.html'
#一覧画面に表示されるカラム
list_display = ('mail', 'fname')
fields = ['mail','lname','fname','lname_k','fname_k','sex','birth_y','birth_m'
#フォームに表示するカラムを定義
,'birth_d','zipn','m_pref_id','pref1','pref2','tel','syumi','bikou']
#フォームに表示させたくないカラムを定義(fields とは同時に使えない)
exclude = ['pref2','insert_date','update_date','tks']
#リードオンリーになるが、input 属性じゃなくなるので注意!
readonly_fields = []
#一覧画面右に絞り込み用の領域が表示される
list_filter = ['mail','fname']
#一覧画面右に検索ボックスが表示される(検索対象のカラムは複数設定できる)
search_fields = ['mail','fname']
※フォーム取得メソッドをオーバーライドする
def get_form(self,
request,
obj=None, **kwargs):
※フォームを[更新][追加]画面で切り替えたい場合は
obj の有無で分岐できる(
obj があれば更新画面)
if
obj:
#Admin 独自を使う場合はこっち ⇒ ProfileFormAdmin
self.form =
ProfileForm
#主キーは隠す ※この forms は、from django import forms のもの
self.form.base_fields['mail'].widget = forms.HiddenInput()
#色々なオプションを追加できる
self.form.base_fields['fname'].widget.attrs.update({'style':'color:red;'})
#独自メソッドで文字列を配列に変換している
obj.syumi =
strListToList(
obj.syumi)
self.form.base_fields['birth_y'].initial =
obj.birth[0:4]
#前ゼロがあれば削除している
self.form.base_fields['birth_m'].initial = int(
obj.birth[4:6])
前ゼロがあれば削除している
self.form.base_fields['birth_d'].initial = int(
obj.birth[6:8])
self.form.base_fields['birth_m'].label = '(月)'
self.form.base_fields['birth_d'].label = '(日)'
#外部キーを設定しているカラムはこうしないと上手く表示できなかった。
self.form.base_fields['m_pref_id'].initial =
obj.m_pref_id
else:
#サンプルなので[追加]画面も同じフォームモデルを設定している
self.form =
ProfileForm
self.form.base_fields['sex'].initial = '1'
self.form.base_fields['birth_m'].label = '(月)'
self.form.base_fields['birth_d'].label = '(日)'
#お約束
return super().get_form(
request,
obj, **kwargs)
※保存処理をオーバーライドする
def save_model(self,
request,
obj, form, change):
※処理を[更新][追加]で分岐する必要があり、change の場合は更新処理となる
if change:
※年月日を結合(月と日は必ず2桁にするため zfill メソッドを利用)
obj.birth =
request.POST['birth_y'] +
request.POST['birth_m'].zfill(2) +
request.POST['birth_d'].zfill(2)
#外部キーは良くわからないが入れなおす。
obj.m_pref_id =
request.POST['m_pref_id']
myJST = timezone(timedelta(hours = 9), 'Japan')
#datetime 形式のカラムに保存する場合、タイムゾーン付きのオブジェクトじゃないとワーニングを吐きます
obj.update_date = datetime.now(tz =
myJST)
※更新の場合は更新の対象を設定できる(主キーを設定したらエラーになる)
uf = ['fname','lname','fname_k','lname_k','sex','birth','zipn','m_pref_id','pref1','pref2','tel','syumi','update_date']
obj.save(
update_fields =
uf)
else:
obj.m_pref_id =
request.POST['m_pref_id']
obj.birth =
request.POST['birth_y'] +
request.POST['birth_m'].zfill(2) +
request.POST['birth_d'].zfill(2)
myJST = timezone(timedelta(hours = 9), 'Japan')
obj.insert_date = datetime.now(tz =
myJST)
obj.save()
※一覧画面の表示をオーバーライドできる
def changelist_view(self,
request, extra_context=None):
print('changelist_view...')
return super(
ProfileAdmin, self).changelist_view(
request, extra_context=extra_context)
※更新画面の表示をオーバーライドできる
def change_view(self,
request, object_id, form_url='', extra_context=None):
extra_context = {'hoge':'ほげ~'} ※ビュー側にアサイン可能
return self.changeform_view(
request, object_id, form_url, extra_context)
※追加画面の表示をオーバーライドできる
def add_view(self,
request, form_url='', extra_context=None):
extra_context = {'hoge':'ふ~'} ※ビュー側にアサイン可能
return self.changeform_view(
request, None, form_url, extra_context)
#最後に第1引数:モデル、第2引数:上記クラスで register メソッドを実行する
admin.site.register(
Profile,
ProfileAdmin)