LoginSignup
0
0

Wagtaiでviews.pyやurls.pyを使わずにHTMLテンプレートにDBモデルのデータを表示する方法

Posted at

きっかけ

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にこのように書きます。

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()で公開設定のものを全て取得していますが、必要に応じて
他の条件フィルタをかけるなども可能です。

続いてテンプレート側での表示のさせ方を説明します。
このように書いてください。

home_page.html
{% for shop in shops %}
    <div>
        <div>{{shop.name}}</div>
        <p>{{shop.detail}}</p>
    </div>
{% endfor %}

forでループさせます。モデルのカラム名(例ではnameやdetail)をドットで繋いでください。

以上です。

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