きっかけ
wagtailプロジェクトをビルドした際にデフォで作成されるhomeアプリケーションの中の
templatesディレクトリにhome_page.htmlに他のアプリケーションのモデルのデータを
表示したいということがありました。
結論:models.pyにコンテキストで渡す
homeアプリケーションのmodels.pyに他のアプリケーションのモデルをimportしてきて
コンテキストでhome_page.htmlにDBのデータを渡すことができます。
前提として、base.pyのINSTALED_APPに他のアプリケーションの登録、プロジェクトアプリのurls.pyに
インクルードする設定は完了していることとします。
shopというアプリケーションがあったと仮定して、そのshopのmodels.pyの内容を
home_page.htmlに表示します。
早速、コンテキストの書き方を紹介します。models.pyにこのように書きます。
from django.db import models
from wagtail.models import Page
from wagtail.fields import RichTextField
from wagtail.admin.panels import FieldPanel
#shopアプリケーションのモデルクラス(例では"ShopPage")をインポート
from shop.models import ShopPage
class HomePage(Page):
body = RichTextField(blank=True)
content_panels = Page.content_panels + [
FieldPanel('body'),
]
#ここがコンテキスト
def get_context(self, request, *args, **kwargs):
context = super().get_context(request, *args, **kwargs)
context['shops'] = ShopPage.objects.live().all()
return context
これで、テンプレート側にデータを渡す準備が完了です。
テンプレート側で、'shops'という名前で受け取ることができます。
今回は、.live().all()で公開設定のものを全て取得していますが、必要に応じて
他の条件フィルタをかけるなども可能です。
続いてテンプレート側での表示のさせ方を説明します。
このように書いてください。
{% for shop in shops %}
<div>
<div>{{shop.name}}</div>
<p>{{shop.detail}}</p>
</div>
{% endfor %}
forでループさせます。モデルのカラム名(例ではnameやdetail)をドットで繋いでください。
以上です。