質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

ただいまの
回答率

88.58%

Djangoにおいて、テーブルの値を読み取り表示することができない

解決済

回答 1

投稿

  • 評価
  • クリップ 0
  • VIEW 112

DR.py

score 16

前提・実現したいこと

Djangoの管理サイトから作った日記のタイトルと本文の20文字を読み取ってmypageに表示したい

発生している問題・エラーメッセージ

エラーは何も起こっておらず、テーブルにもしっかり値が入力されているのですがマイページに日記がありませんと表示されてしまう。

mypage.html

{% extends 'base.html' %}
{% load static %}

{% block title %}マイページ % endblock %}

{% block active_mypage %}active{% endblock %}

{% block head %}
<link href="{% static 'css/clean-blog.min.css' %}" rel="stylesheet">
{% endblock %}

{% block contents %}
<div class="container">
    <div class="row">
        <div class="my-div-style w-100">
            <div class="col-lg-8 col-md-10 mx-auto">
                {% for home in mypage %}
                    <div class="post-preview">
                        <a href="#">
                          <h2 class="post-title">
                            {{ home.title }}
                          </h2>
                          <h3 class="post-subtitle">
                            {{ home.content|truncatechars:20 }}
                          </h3>
                        </a>
                        <p class="post-meta">{{ home.created_at }}</p>
                    </div>
                    <hr>
                {% empty %}
                    <p>日記がありません。</p>
                {% endfor %}

            </div>
        </div>
    </div>
</div>
{% endblock %}

model.py

from accounts.models import CustomUser
from django.db import models


class home(models.Model):
    """日記モデル"""

    user = models.ForeignKey(CustomUser, verbose_name='ユーザー', on_delete=models.PROTECT)
    title = models.CharField(verbose_name='タイトル', max_length=40)
    content = models.TextField(verbose_name='本文', blank=True, null=True)
    photo1 = models.ImageField(verbose_name='写真1', blank=True, null=True)
    photo2 = models.ImageField(verbose_name='写真2', blank=True, null=True)
    photo3 = models.ImageField(verbose_name='写真3', blank=True, null=True)
    created_at = models.DateTimeField(verbose_name='作成日時', auto_now_add=True)
    updated_at = models.DateTimeField(verbose_name='更新日時', auto_now=True)

    class Meta:
        verbose_name_plural = 'home'

    def __str__(self):
        return self.title

urls.py

from django.urls import path

from . import views


app_name = 'home'
urlpatterns = [
    path('', views.IndexView.as_view(), name="index"),
    path('inquiry/', views.InquiryView.as_view(), name="inquiry"),
    path('mypage/', views.MypageView.as_view(), name="mypage"),
]

view.py

class MypageView(LoginRequiredMixin, generic.ListView):
    model = home
    template_name = 'mypage.html'

    def get_queryset(self):
        diaries = home.objects.filter(user=self.request.user).order_by('-created_at')
        return diaries

試したこと

mypage.htmlの{% for home in mypage %}のhomeをhome_mypageなどに変えてみたが表示は変わらなかった。

makemigrationsとmigrateはエラーなく実行することができた

補足情報(FW/ツールのバージョンなど)

DBのテーブルにはしっかりとデータが入っている
>python manage.py dbshell
=# \dt
リレーション一覧
スキーマ |                 名前                 |    型    |  所有者
----------+--------------------------------------+----------+----------
public   | account_emailaddress                 | テーブル | postgres
public   | account_emailconfirmation            | テーブル | postgres
public   | accounts_customuser                  | テーブル | postgres
public   | accounts_customuser_groups           | テーブル | postgres
public   | accounts_customuser_user_permissions | テーブル | postgres
public   | auth_group                           | テーブル | postgres
public   | auth_group_permissions               | テーブル | postgres
public   | auth_permission                      | テーブル | postgres
public   | django_admin_log                     | テーブル | postgres
public   | django_content_type                  | テーブル | postgres
public   | django_migrations                    | テーブル | postgres
public   | django_session                       | テーブル | postgres
public   | django_site                          | テーブル | postgres
public   | home_home                      | テーブル | postgres

=# select * from home_home;

id | title  |     content      |                               photo1                                | photo2 | photo3 |          created_at           |          updated_at           | user_id
----+--------+------------------+---------------------------------------------------------------------+--------+--------+-------------------------------+-------------------------------+---------
  1 | 最高   | お宝が二十個ある | The_Go_Programming_Language_-_Google_Chrome_2020_09_16_16_56_11.png |        |        | 2020-09-23 02:05:23.710549+09 | 2020-09-23 02:39:19.290746+09 |       1
  2 | あふぁ | ;;;           |                                                                     |        |        | 2020-09-23 02:48:20.100619+09 | 2020-09-23 02:48:20.100619+09 |       1
(2 行)
  • 気になる質問をクリップする

    クリップした質問は、後からいつでもマイページで確認できます。

    またクリップした質問に回答があった際、通知やメールを受け取ることができます。

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 過去に投稿した質問と同じ内容の質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

回答 1

checkベストアンサー

0

get_querysetから返される値はテンプレートではobject_listで表示できますので、mypage.htmlの{% for home in mypage %}を{% for home in object_list %}に変えてみたらどうでしょうか?

{% block contents %}
<div class="container">
    <div class="row">
        <div class="my-div-style w-100">
            <div class="col-lg-8 col-md-10 mx-auto">
                # {% for home in mypage %}  # 削除
                {% for home in object_list %}  # 追加
                    <div class="post-preview">
                        <a href="#">
                          <h2 class="post-title">
                            {{ home.title }}
                          </h2>
                          <h3 class="post-subtitle">
                            {{ home.content|truncatechars:20 }}
                          </h3>
                        </a>
                        <p class="post-meta">{{ home.created_at }}</p>
                    </div>
                    <hr>
                {% empty %}
                    <p>日記がありません。</p>
                {% endfor %}

            </div>
        </div>
    </div>
</div>
{% endblock %}

もしくはviews.pyにcontext_object_nameを追加することで任意の変数名に変更できるようです。

# views.py

class MypageView(LoginRequiredMixin, generic.ListView):
    model = home
    template_name = 'mypage.html'
    context_object_name = 'mypage'  # 追加

    def get_queryset(self):
        diaries = home.objects.filter(user=self.request.user).order_by('-created_at')
        return diaries
{% block contents %}
<div class="container">
    <div class="row">
        <div class="my-div-style w-100">
            <div class="col-lg-8 col-md-10 mx-auto">
                {% for home in mypage %}  # そのまま
                    <div class="post-preview">
                        <a href="#">
                          <h2 class="post-title">
                            {{ home.title }}
                          </h2>
                          <h3 class="post-subtitle">
                            {{ home.content|truncatechars:20 }}
                          </h3>
                        </a>
                        <p class="post-meta">{{ home.created_at }}</p>
                    </div>
                    <hr>
                {% empty %}
                    <p>日記がありません。</p>
                {% endfor %}

            </div>
        </div>
    </div>
</div>
{% endblock %}

参考文献:Djangoのobject_listの名前を変更する方法 | Awesome Blog

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2020/09/23 21:45

    ありがとうございます。
    テーブルの中を読み込むことができたと思います。
    ですが「日記がありません」とは出てこなくなったのですが、肝心の日記のタイトルも出てこないです。
    もう少し自分で調べてみます。
    丁寧な2パターンの回答ありがとうございます。

    キャンセル

15分調べてもわからないことは、teratailで質問しよう!

  • ただいまの回答率 88.58%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる

関連した質問

同じタグがついた質問を見る