Django:データベースにある複数の値をhtml上で参照する方法

皆様ごきげんよう、本日はDjangoで利用しているMysqlに登録されているデータをHtml上で参照するにはどうすればよいかについてナレッジを残しておきます。少しでも参考になりますと幸いです。

前提情報

ー Mysqlを利用しています。
ー 既にデータが登録できるようにモデルの設定(models.py側)ができている。

データの取得に関わるファイル

(1)views.pyファイルではデータベースから辞書型のオブジェクトで値を引っ張ってくる記述をする。
(2)urls.pyで、データを利用するファイルとviews.pyで設定した関数を紐づける。
(3)HTML上で{{辞書のキー}}を宣言する事により、データベースから取得したデータを取り扱えるようになる。

views.pyの記載方法(サンプル)

たとえば、ArticlesとLanguageのclassをmodels.pyで宣言している場合。ArticlesViewの中で、複数のデータ取得を行う為の設定を行えます。

class ArticlesView(TemplateView):
    template_name = "article.html"
    model = Articles, Language #models.py側で宣言しているclassをviews.pyで連携させる

    # usernameを取得して表示できるようにする
    def get_context_data(self):
        ctxt = super().get_context_data()
    # 取得したいデータを宣言して
        ctxt['article_list'] = Articles.objects.filter(category_id=3).order_by('-created')[:5] # Articlesのテーブルデータの項目、category_idが3で、なおかつ作成されたばかりの最新5件を取得するという意味。article_listは変数名。この変数名をのちにhtmlで利用します。
        ctxt['language_jp_list'] = Language.objects.filter(language_id=2).order_by('-created')[:5] # Languageのテーブルデータの項目、language_idが2で、なおかつ作成されたばかりの最新5件を取得するという意味。language_listは変数名。この変数名をのちにhtmlで利用します。

    return ctxt

urls.pyの記載方法(サンプル)

from django.contrib import admin
from django.urls import path
from . import views
from .views import Articles #models.pyで宣言しているclassをimportする


urlpatterns = [
    path('', IndexView.as_view(), name='index'),
    path('contents/', Articles.as_view(), name='articlespage'),
・・・・その他必要なpath設定
]

app_name = 'アプリ名'

HTMLでデータ表示する為の記載方法(サンプル)

HTMLの中に、{% %}や{{ }}を利用してviews.pyで取得したデータを表示させる事ができます。views.py側で取得したデータは辞書型なので、for loopを利用して中身を表示するようにhtml側で記述します。もしデータが無かった時の為に{% empty %}と書き、その後には代わりに表示する文章を入れます。そして最後にfor loopを閉じる{% endfor %}を記述してあげればOKです。

・・・・・前の部分は省略        
<!-- content area -->
        <td valign="top" align="center" width="80%">
            <p>
                <b>新着</b>
                <table width="100%" height="100%">
                    <thead>
                    <tr>
                        <th>記事のタイトル</th>
                        <th>日本語の記事</th>
                    </tr>
                    </thead>
                    <tbody>
                    <tr>
            {% for article in articles_list %}
                        <td>{{ article.title }}</td>
                        {% empty %}
                        <td>空の為、記事が表示できません</td>
                        {% endfor %}
                        {% for japanese in language_jp_list %}
                        <td>{{ japanese.title }}</td>
                        {% empty %}
                        <td>空の為、記事が表示できません</td>
                        {% endfor %}
                    </tr>
                    </tbody>
                </table>
・・・・・その後は省略

このようにして複数のモデル情報を1つのViewを通して取り扱う事ができるようになりました。

Comments are closed

Latest Comments

No comments to show.