python3.doc_51
R e i - D r e a m
for Laravel
TOP > Python3 > Django(ADMIN)
Guest
login

最終投稿日:2022年6月18日

Django(ADMIN)
Admin 基本
プロジェクト側の urls.py に以下の設定がある場合は Admin ページが利用できます。
urlpatterns = [
    ~ 省略 ~
    url('admin/' , admin.site.urls),
]
※スタッフ権限がないとログインできないので注意
● スーパーユーザー作成(スタッフ権限も付く)
以下のコマンドでプロンプトから対話形式で登録する
    python manage.py createsuperuser
登録した内容
    ユーザー:hoge
    パスワード:xxxxxxxx
    メール:[email protected]
以下の様に auth_user テーブルに登録される
password pbkdf2_sha256$10...
last_login 2018-02-04 13:44:27.963766
is_superuser 1
username hoge
first_name
last_name
email [email protected]
is_staff 1
is_active 1
date_joined 2018-02-04 13:38:51.404516
アプリ(モデル)の追加
● 単純な追加
自作のアプリも Admin ページに組み込む事が可能です。
例えば、hoge アプリの HogeTbl モデルを Admin ページに組み込むには以下の様に設定します。
例)
[hoge/admin.py]
    from django.contrib import admin
    from .models import HogeTbl
    admin.site.register(HogeTbl)
● カスタマイズ
上の例はあくまで簡易的に Admin ページにモデルを表示する方法です。
もう少し細かな設定をしたい場合は以下の様にします。
例として【サンプル1】プロフィールフォームで作成した Profile モデルを Admin ページへ登録します。
例)
[prof/admin.py] ※prof はアプリ名
    from django.contrib import admin
    from django import forms
    #自身のモデルをインポートする
    from .models import Profile
    #自身の forms.py の内容を全てインポートする
    from .forms import *
    from datetime import date, time, datetime, timedelta, timezone
    """ 文字列の ['1' , '2'] を本当のリストにする """
    def strListToList(s):
        s = s.replace("[","")
        s = s.replace("]","")
        s = s.replace("'","")
        s = s.replace(" ","")
        return s.split(",")
    # admin用に独自フォームを作りたい場合は forms.py の要領で作成できる
    class ProfileFormAdmin(forms.ModelForm):
        class Meta:
            model = Profile
            #exclude = ('tks', 'insert_date', 'update_date','m_pref')
            fields = ('mail', 'fname')
        mail = forms.CharField(
            label = 'E-Mail',
            max_length = 50,
            widget = forms.TextInput(
                attrs = {'size':'30'}
            ),
        )
        fname = forms.CharField(
            label ='名',
            max_length = 10,
            widget = forms.TextInput(
                attrs = {'size':'15'}
            ),
        )
※メインクラス
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)
[admin/prof/profile/change_form.html]
{% extends "admin/change_form.html" %}                ※django のファイルを継承する
{% block field_sets %}
自由に何か書けます
{{hoge}}                                                                                       ※アサインしていれば変数も使えます
{% for fieldset in adminform %}
     {% include "admin/includes/fieldset.html" %}    ※定義したフォームを全て出力する
{% endfor %}
自由に何か書けます
{% endblock %}
ログインしてコメントを残そう!!


きっぷる