最初のDjangoアプリの作成、パート7
このチュートリアルは、 Tutorial 6 が中断したところから始まります。 私たちはWeb-pollアプリケーションを継続しており、 Tutorial 2 で最初に調査したDjangoの自動生成された管理サイトのカスタマイズに焦点を当てます。
管理フォームをカスタマイズする
Question
モデルをadmin.site.register(Question)
に登録することで、Djangoはデフォルトのフォーム表現を構築することができました。 多くの場合、管理フォームの外観と動作をカスタマイズする必要があります。 これを行うには、オブジェクトを登録するときに必要なオプションをDjangoに伝えます。
編集フォームのフィールドを並べ替えて、これがどのように機能するかを見てみましょう。 admin.site.register(Question)
行を次のように置き換えます。
from django.contrib import admin
from .models import Question
class QuestionAdmin(admin.ModelAdmin):
fields = ['pub_date', 'question_text']
admin.site.register(Question, QuestionAdmin)
モデルの管理オプションを変更する必要があるときはいつでも、このパターンに従い、モデル管理クラスを作成し、それを2番目の引数としてadmin.site.register()
に渡します。
上記のこの特定の変更により、「発行日」は「質問」フィールドの前になります。
Fields have been reordered これは2つのフィールドだけでは印象的ではありませんが、数十のフィールドを持つ管理フォームの場合、直感的な順序を選択することがユーザビリティの重要な詳細です。
また、数十のフィールドを持つフォームについて言えば、フォームをフィールドセットに分割することをお勧めします。
from django.contrib import admin
from .models import Question
class QuestionAdmin(admin.ModelAdmin):
fieldsets = [
(None, {'fields': ['question_text']}),
('Date information', {'fields': ['pub_date']}),
]
admin.site.register(Question, QuestionAdmin)
fieldsets の各タプルの最初の要素は、フィールドセットのタイトルです。 フォームは次のようになります。
管理者変更リストをカスタマイズする
質問管理ページの見栄えが良くなったので、システム内のすべての質問を表示する「変更リスト」ページにいくつかの調整を加えましょう。
この時点での様子は次のとおりです。
Polls change list page
デフォルトでは、Djangoは各オブジェクトのstr()
を表示します。 ただし、個々のフィールドを表示できると便利な場合があります。 これを行うには、 list_display adminオプションを使用します。これは、オブジェクトの変更リストページに列として表示するフィールド名のタプルです。
class QuestionAdmin(admin.ModelAdmin):
# ...
list_display = ('question_text', 'pub_date')
念のため、 Tutorial 2 のwas_published_recently()
メソッドも含めましょう。
class QuestionAdmin(admin.ModelAdmin):
# ...
list_display = ('question_text', 'pub_date', 'was_published_recently')
これで、質問変更リストページは次のようになります。
Polls change list page, updated
was_published_recently
ヘッダーの場合を除いて、列ヘッダーをクリックしてこれらの値で並べ替えることができます。これは、任意のメソッドの出力による並べ替えがサポートされていないためです。 また、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?'
これらのメソッドプロパティの詳細については、 list_display を参照してください。
polls/admin.py
ファイルを再度編集し、Question
変更リストページに改善を追加します: list_filter を使用したフィルター。 QuestionAdmin
に次の行を追加します。
list_filter = ['pub_date']
これにより、pub_date
フィールドで変更リストをフィルタリングできる「フィルター」サイドバーが追加されます。
Polls change list page, updated
表示されるフィルターの種類は、フィルタリングするフィールドの種類によって異なります。 pub_date
は DateTimeField であるため、Djangoは適切なフィルターオプション(「任意の日付」、「今日」、「過去7日間」、「今月」、「今年」)を提供することを知っています。
これはうまく形作られています。 検索機能を追加しましょう。
search_fields = ['question_text']
これにより、変更リストの上部に検索ボックスが追加されます。 誰かが検索語を入力すると、Djangoはquestion_text
フィールドを検索します。 必要な数のフィールドを使用できますが、バックグラウンドでLIKE
クエリを使用するため、検索フィールドの数を適切な数に制限すると、データベースでの検索が容易になります。
また、変更リストを使用するとページ付けが無料になることに注意してください。 デフォルトでは、1ページに100個のアイテムが表示されます。 リストページ付けの変更、検索ボックス、フィルター、日付階層、および列ヘッダー順序すべてあなたが彼らがすべきだと思うように一緒に働きなさい。
管理者のルックアンドフィールをカスタマイズする
明らかに、各管理ページの上部に「Django管理」があるのはばかげています。 単なるプレースホルダーテキストです。
ただし、Djangoのテンプレートシステムを使用して変更できます。 Django管理者はDjango自体を利用しており、そのインターフェースはDjango独自のテンプレートシステムを使用しています。
プロジェクトのテンプレートのカスタマイズ
プロジェクトディレクトリ(manage.py
を含むディレクトリ)にtemplates
ディレクトリを作成します。 テンプレートは、Djangoがアクセスできるファイルシステム上のどこにでも存在できます。 (Djangoは、サーバーが実行するすべてのユーザーとして実行されます。)ただし、プロジェクト内にテンプレートを保持することは、従うべき良い規則です。
設定ファイルを開きます(mysite/settings.py
、覚えておいてください)そして追加します :setting: `DIRS ` のオプション :setting: `TEMPLATES` 設定:
TEMPLATES = [
{
'BACKEND': 'django.template.backends.django.DjangoTemplates',
'DIRS': [os.path.join(BASE_DIR, 'templates')],
'APP_DIRS': True,
'OPTIONS': {
'context_processors': [
'django.template.context_processors.debug',
'django.template.context_processors.request',
'django.contrib.auth.context_processors.auth',
'django.contrib.messages.context_processors.messages',
],
},
},
]
:setting: `DIRS ` Djangoテンプレートをロードするときにチェックするファイルシステムディレクトリのリストです。 それは検索パスです。
テンプレートの整理
静的ファイルと同じように、はすべてのテンプレートを1つの大きなテンプレートディレクトリにまとめることができ、完全に機能します。 ただし、特定のアプリケーションに属するテンプレートは、そのアプリケーションのテンプレートディレクトリに配置する必要があります(例: プロジェクト(templates
)ではなくpolls/templates
)。 再利用可能なアプリのチュートリアル なぜこれを行うのかについて詳しく説明します。
次に、templates
内にadmin
というディレクトリを作成し、Django自体のソースコード(django/contrib/admin/templates
のデフォルトのDjango管理テンプレートディレクトリ内からテンプレートadmin/base_site.html
をコピーします。 ])そのディレクトリに。
Djangoのソースファイルはどこにありますか?
Djangoソースファイルがシステムのどこにあるかを見つけるのが難しい場合は、次のコマンドを実行します。
次に、ファイルを編集し、テンプレート:Site header
(中括弧を含む)を自分のサイトの名前に置き換えます。 最終的に次のようなコードのセクションが作成されます。
{% block branding %}
<h1 id="site-name"><a href="{% url 'admin:index' %}">Polls Administration</a></h1>
{% endblock %}
このアプローチを使用して、テンプレートをオーバーライドする方法を説明します。 実際のプロジェクトでは、おそらく django.contrib.admin.AdminSite.site_header 属性を使用して、この特定のカスタマイズをより簡単に行うことができます。
このテンプレートファイルには、{% block branding %}
やテンプレート:Title
などのテキストがたくさん含まれています。 {%
および{{
タグは、Djangoのテンプレート言語の一部です。 Djangoがadmin/base_site.html
をレンダリングすると、 Tutorial 3 で見たように、このテンプレート言語が評価されて最終的なHTMLページが生成されます。
Djangoのデフォルトの管理テンプレートはどれでもオーバーライドできることに注意してください。 テンプレートを上書きするには、base_site.html
で行ったのと同じことを行います。デフォルトのディレクトリからカスタムディレクトリにテンプレートをコピーし、変更を加えます。
アプリケーションのテンプレートのカスタマイズ
鋭敏な読者は尋ねるでしょう:しかしもし :setting: `DIRS ` デフォルトでは空でしたが、Djangoはどのようにしてデフォルトの管理テンプレートを見つけましたか? 答えはそれです :setting: `APP_DIRS ` に設定されていますTrue
、Djangoは自動的にtemplates/
フォールバックとして使用するための、各アプリケーションパッケージ内のサブディレクトリ(忘れないでください)django.contrib.admin
アプリケーションです)。
私たちの投票アプリケーションはそれほど複雑ではなく、カスタム管理テンプレートを必要としません。 しかし、それがより洗練され、その機能の一部についてDjangoの標準管理テンプレートの変更が必要になった場合、プロジェクトのテンプレートよりもアプリケーションのテンプレートを変更する方が賢明です。 そうすれば、新しいプロジェクトに投票アプリケーションを含めることができ、必要なカスタムテンプレートが確実に見つかるようになります。
Djangoがテンプレートを見つける方法の詳細については、テンプレート読み込みドキュメントを参照してください。
管理者インデックスページをカスタマイズする
同様に、Django管理者インデックスページのルックアンドフィールをカスタマイズすることもできます。
デフォルトでは、管理アプリケーションに登録されている:setting: `INSTALLED_APPS` 内のすべてのアプリがアルファベット順に表示されます。 レイアウトに大幅な変更を加えることができます。 結局のところ、インデックスはおそらく管理者の最も重要なページであり、使いやすいはずです。
カスタマイズするテンプレートはadmin/index.html
です。 (前のセクションのadmin/base_site.html
と同じように、デフォルトのディレクトリからカスタムテンプレートディレクトリにコピーします)。 ファイルを編集すると、app_list
というテンプレート変数が使用されていることがわかります。 その変数には、インストールされているすべてのDjangoアプリが含まれています。 それを使用する代わりに、オブジェクト固有の管理ページへのリンクを、最善と思われる方法でハードコーディングできます。
次は何ですか?
初心者向けチュートリアルはここで終了します。 それまでの間、ここからどこへ行くかに関するいくつかのポインタを確認することをお勧めします。
Pythonパッケージングに精通していて、ポーリングを「再利用可能なアプリ」に変換する方法の学習に興味がある場合は、高度なチュートリアル:再利用可能なアプリの作成方法を確認してください。