自動化無しに生活無し

WEBとかAIとかLinux関係をひたすら書く備忘録系ブログ

Djangoの管理サイト(admin)のフォームをforms.pyを使用してカスタムする【文字列入力フォームをtextareaタグで表現】

thumbnail

管理サイトのフォームはとりわけ何もしなければ、registerするモデルフィールドに依存する。

つまり、CharFieldの場合、inputタグtype="text"が自動的に管理画面のフォームに挿入される。

そのため、何もしなければフィールドオプションがmax_length=2000でも1行のテキストボックスでしか入力できない。

テキストボックスで入力しにくい、改行出来ない

改行もできなければ全体を確認することも困難な管理画面のフォームを使いたいと思う人はいない。だからこそ、ここでフォームをカスタムさせ、使いやすくさせる。

forms.pyに管理画面で使う専用のフォームクラスを定義

まずは管理画面で使う専用のフォームクラスを定義する。

from django import forms
from .models import Topic

class TopicAdminForm(forms.ModelForm):

    class Meta:
        model   = Topic
        fields  = [ "title","comment","dt" ]

    comment     = forms.CharField(  widget  = forms.Textarea( attrs={ "maxlength":str(Topic.comment.field.max_length), } ),
                                    label   = Topic.comment.field.verbose_name 
                                    )

入力可能な最長文字列はモデルから参照、フォームのとなりに表示させるラベルも同様にモデルから参照。

admin.pyから呼び出す

下記のように呼び出す。

from django.contrib import admin

from .models import Topic
from .forms import TopicAdminForm

class TopicAdmin(admin.ModelAdmin):

    #textareaを表示させるフォームクラスを指定。
    form            = TopicAdminForm

admin.site.register(Topic,TopicAdmin)

そしてこうなる

before

テキストボックスで入力しにくい、改行出来ない

after

テキストエリアが表示された。

結論

これで管理サイトがさらに使いやすくなった。

maxlength属性とlabelはモデルのフィールドオプションから参照する仕掛けにしておけば、モデルが書き換わっても即対応できる。

ちなみに、今回のフォームクラスはlist_editableで表示されるフォームとは関連していないので注意。

スポンサーリンク

シェアボタン

Twitter LINEで送る Facebook はてなブログ