LoginSignup
3
0

More than 1 year has passed since last update.

Django+Reactで学ぶプログラミング基礎(16): Djangoチュートリアル(投票アプリその7-2)

Last updated at Posted at 2022-06-10
[前回] Django+Reactで学ぶプログラミング基礎(15): Djangoチュートリアル(投票アプリその7-1)

はじめに

Django公式チュートリアル、その7-2です。
前回は、管理サイトをカスタマイズしました。
今回は、その続きです。

Djangoアプリ作成(その7-2): 投票(poll)アプリ

今回の内容

  • 管理サイトの変更リスト(change list)ページをカスタマイズ
    • 変更リスト(change list)ページとは
      • 全ての質問をリスト表示し、変更するためのページ
    • フィールドによるソート機能
    • フィルター機能
    • 検索機能

Tips: VS CodeでPythonのvenv環境をデフォルトでアクティベートしたい

  • VS Codeを起動

    • F1キーを押し、コマンドパレットを開く
      • Python: インタープリターと入力/選択
        image.png
  • 投票アプリで使用したいPython仮想環境を選択
    image.png

  • ターミナルを起動

    • すると、自動でactivateコマンドが実行され、仮想環境に入る
      image.png

管理サイトの変更リストページをカスタマイズ

  • VS Codeからサーバーを起動
(venv) C:\kanban\pollsite>python manage.py runserver
  • ブラウザで、管理サイトの変更リストページにアクセス
    • http://127.0.0.1:8000/admin/polls/question/
      image.png

Questionオブジェクトの各フィールドを表示する

  • list_displayオプションを使用
    • カラム表示したいフィールドの名前をタプルにして指定
polls/admin.py
class QuestionAdmin(admin.ModelAdmin):
    # ...
    list_display = ('question_text', 'pub_date', 'was_published_recently')

image.png

※ ソース修正後には、保存を忘れず(Ctrl+S)。

  • ブラウザで、変更リストページを更新(F5)
    • http://127.0.0.1:8000/admin/polls/question/
    • フィールドが追加表示されました
      image.png

フィールド値の並べ替え

  • DATE PUBLISHEDヘッダーをクリックすると、エントリを並べ替えてくれる
    image.png

  • was_published_recentlyヘッダーをクリック、あれー、並べ替えボタンが現れない

    • 改善: display()デコレータを使用
polls/models.py
from django.contrib import admin

class Question(models.Model):
    # ...
    @admin.display(
        boolean=True,
        ordering='pub_date',
        description='Published recently?',
    )
    def was_published_recently(self):
        now = timezone.now()
        return now - datetime.timedelta(days=1) <= self.pub_date <= now

image.png

  • 並べ替えボタンが表示されました
    image.png

フィルター(Filter)サイドバーを作成

  • 質問変更リストページにlist_filterを追加
    • フィルタの種類は、対象フィールドの種類に応じて変化
    • QuestionAdminクラスに、次の行を追加
      • ※ ファイル保存を忘れず(Ctrl+S)
polls/admin.py
list_filter = ['pub_date']

image.png

  • フィルターサイドバーが表示されました
    image.png

検索機能を追加

  • 変更リストの上部に検索ボックスを作成
    • ユーザが検索語を入力すると、question_textフィールドを検索してくれる
    • 内部では、LIKEクエリを使って検索するため、データベースに負荷がかかる
polls/admin.py
search_fields = ['question_text']

image.png

  • 検索窓が表示され、検索可能になりました
    image.png

  • 更新リストのページ分割機能

    • デフォルトで、ページあたり100個の要素を表示
  • 更新リストページの以下機能は協調して動作

    • ページ分割
    • 検索ボックス
    • フィルター
    • 日付による階層化
    • カラムヘッダーを使った並べ替え

おわりに

管理サイトで、更新リストページをカスタマイズしました。
検索やフィルター機能を一瞬で実装できるなんて、Djangoすごい!
次回も続きます。お楽しみに。

[次回] Django+Reactで学ぶプログラミング基礎(17): Djangoチュートリアル(投票アプリその7-3)
3
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
3
0