0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 3 years have passed since last update.

Pythonでのチームアプリ開発に参画するための学習履歴~Djangoチュートリアル7~

Posted at

はじめに

Djangoチュートリアルもこれで基本的な部分は最後となります。
最後は、アプリの管理ページのカスタマイズについて少し見ていきましょう。
DjangoにはXAMPPでいうphpMyAdminのようにSQLを使わなくてもブラウザでテーブルにレコードの追加や更新・削除を行えるadminフォームという機能があるのでそれをカスタマイズしていきます。

基本的なカスタマイズ

polls/admin.py

from django.contrib import admin

from .models import Question


class QuestionAdmin(admin.ModelAdmin):
    fields = ['pub_date', 'question_text']

admin.site.register(Question, QuestionAdmin)

QuestionAdminクラス以下がカスタム内容です。
つまり、モデルごとにクラスを作ることで各テーブルごとにカスタム内容を変えることができるわけです。
fieldsでマイグレーションで作成したテーブルの各カラム名を指定します。このとき左から順に実際の表示位置では表示されます。
次にフィールドを増やしてみましょう。



class QuestionAdmin(admin.ModelAdmin):
    fieldsets = [
        (None,               {'fields': ['question_text']}),
        ('Date information', {'fields': ['pub_date']}),
    ]

fieldsfieldssetにして(フィールド名, {'fields': ['カラム名']})と設定してあげるとこのカラムはどの情報だよという表示にすることができます。
例えば ('Date information', {'fields': ['pub_date']})ならpub_dateDate information(日付に関する情報)だよという表示にすることができます。

リレーションしたテーブルのオブジェクトを追加する



from .models import Choice, Question
# ...
admin.site.register(Choice)


Choiceモデルをインポートしadmin.site.register(Choice)を追加します。
こうすることでChoiceモデルを編集できるようになります。
ですが、今回は1つの質問に対して複数の答えがあるといったリレーションなので、Questionオブジェクトを追加する際にそれに付随してChoiceオブジェクトを追加できた方が都合がいいのでそのように変更してみます。



from django.contrib import admin

from .models import Choice, Question


class ChoiceInline(admin.TabularInline):
    model = Choice
    extra = 3


class QuestionAdmin(admin.ModelAdmin):
    fieldsets = [
        (None,               {'fields': ['question_text']}),
        ('Date information', {'fields': ['pub_date'], 'classes': ['collapse']}),
    ]
    inlines = [ChoiceInline]

admin.site.register(Question, QuestionAdmin)


ChoiceInlineクラスでリレーション先のモデルとデータ数を設定します(上の例だと1つのQuestionオブジェクトに対して、Choiceオブジェクトを3つ分のフィールドが用意される)。
引数にTabularInlineを指定するとphpMyAdminのようなテーブル形式の見た目に変更できます。
'classes': ['collapse']を指定したフィールドは折りたたまれた状態で表示されます。
inlines = [ChoiceInline]で先程のChoiceInlineクラスを指定します。

モデルのインデックスにあたるページをカスタマイズする

実はデフォルトのままだとモデルのレコードの一覧にあたるページ(DjangoではChange Listと呼ばれるみたいです)にはカラムが1つしか表示されません。
これでは不便なのでレコードのカラムをすべて表示できるようにしましょう。
admin.pyQuestionAdminクラスに下記の項目を追加していきます。

polls/admin.py

# Change Listで表示するカラムの指定

list_display = ('question_text', 'pub_date', 'was_published_recently')


polls/models.py


class Question(models.Model):
	# 中略
    def was_published_recently(self):
        now = timezone.now()
        return now - datetime.timedelta(days=1) <= self.pub_date <= now
    was_published_recently.admin_order_field = 'pub_date'
    was_published_recently.boolean = True
    was_published_recently.short_description = 'Published recently?'


models.pywas_published_recently()メソッドを上記のように修正します。
メソッドに属性をつけることでさらに細かくカスタムすることができます。
例えばshort_descriptionを指定するとカラムの名前を指定したものに変更する事ができます。
admin_order_fieldにカラム名を指定すると、そのカラムに対してソート(フィルター)をブラウザ上で行えるようになります。
boolean属性を指定するとTrue or Falseの代わりに○×のアイコンが表示されます。
was_published_recentlyTrue or Falseの値を持つのでその代わりにアイコン表示になるということですね。
では再びadmin.pyに戻ります。

polls/admin.py


from django.contrib import admin
from .models import Question, Choice

# Register your models here.

class ChoiceInline(admin.TabularInline):
	model = Choice
	extra = 3

class QuestionAdmin(admin.ModelAdmin):
	list_display = ('question_text', 'pub_date', 'was_published_recently')
	fieldsets = [
		(None,			{'fields': ['question_text']}),
		('Date information', {'fields': ['pub_date'], 'classes': ['collapse']}),
	]
	inlines = [ChoiceInline]
	list_filter = ['pub_date']
	search_fields = ['question_text']

admin.site.register(Question, QuestionAdmin)
# admin.site.register(Choice)

list_filter = ['pub_date']の設定は先程のadmin_order_field の設定と合わせてフィルターサイドバーを表示するようにする設定です。
search_fields = ['question_text']は検索ボックスを表示するようにする設定です。
こうすると、Change List中でこの場合はquestion_textカラムを検索ボックスに入れた検索語で検索できるようになります。

最後に

これでDjangoチュートリアル全7章完遂です。
しかしここまではあくまで基本で例えばこのチュートリアル1つとっても補足の章としてテストとデプロイ・再利用の章がありますし、この章の管理画面のカスタマイズにしても、テンプレートの使用やCSSの適用、管理機能のさらなる詳細設定など色々ありますのでまだまだやらなければならないことは多いです。

完走した感想はというと、Pythonという言語も含めてDjangoは1からプログラミングを始めた人にとってはやや理解が難しいところがあるとは思いますが、逆に他の言語を習得できている人からすると確かに学習コストを少なく習得できるのかもしれないなという手応えは感じています。
これからチーム開発企画を含めて、自分で制作物を作っていきつつさらに理解を深めていきたいと思います。

参考

[Python] Django 管理サイトのカスタマイズ(表示面)
[Django 管理画面逆引きメモ]https://qiita.com/zenwerk/items/044c149d93db097cdaf8)
Djangoドキュメント

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?