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

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

ただいまの
回答率

89.23%

Djangoでコメント機能を実装したいが、コメントが表示されない

解決済

回答 1

投稿

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

swing_swimming

score 11

前提・実現したいこと

Udemyでブログを作り、受講し終えたので、ブログに機能を追加しています。
その中でコメント機能を追加しようと本やインターネットで検索しながら、コメント機能を追加しています。

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

コメントを投稿していますが、表示されません。
sqlite内のレコードを見たところ、投稿自体はできているようですが、内容が表示されません。

該当のソースコード

views.py

class BlogDetailView(DetailView):
    model = Blog

class ReplyView(CreateView):
    model = Reply
    form_class = ReplyForm
    login_url = '/login/'
    initial = {'key': 'value'}
    template_name = 'microblog/reply_form.html'

    def get(self, request, *args, **kwargs):
        form = self.form_class(initial=self.initial)
        params = {
            'form': form,
        }
        return render(request, self.template_name, params)

    def post(self, request, *args, **kwargs):
        form = self.form_class(request.POST)
        content = request.POST['content']
        blog_pk = self.kwargs['pk']
        blog = get_object_or_404(Blog, pk=blog_pk)
        reply = Reply()
        reply.content = content
        reply.owner = request.user
        reply.target = blog

        reply.save()
        params = {
            'form': form,
        }

        if form.is_valid():
            messages.success(self.request, "コメントしました")
            return redirect(to=reverse_lazy("detail", kwargs={"pk": self.kwargs["pk"]}))
        else:
            messages.success(self.request, "コメントに失敗しました")
            return redirect(to=reverse_lazy("detail", kwargs={"pk": self.kwargs["pk"]}))

        return render(request, self.template_name, params)
models.py

class Blog(models.Model):
    content = models.CharField(max_length=140, verbose_name='投稿内容')
    posted_date = models.DateTimeField(auto_now_add=True, verbose_name='投稿時間')
    updated_date = models.DateTimeField(auto_now=True, verbose_name='更新時間')
    owner = models.ForeignKey(User, on_delete=models.CASCADE, related_name='blog_owner')
    image = models.ImageField(upload_to='images/', blank=True, null=True, verbose_name='画像')

class Reply(models.Model):
    content = models.CharField(max_length=140, verbose_name='内容')
    posted_date = models.DateTimeField(auto_now_add=True, verbose_name='コメント投稿時間')
    updated_date = models.DateTimeField(auto_now=True, verbose_name='コメント更新時間')
    owner = models.ForeignKey(User, on_delete=models.CASCADE, related_name='reply_owner')
    target = models.ForeignKey(Blog, on_delete=models.CASCADE, related_name='post_id')
{% extends "base.html" %}
{% load static %}
{% block body %}
    <div class="row">
        <div class="col-lg-8 col-lg-offset-2 col-md-10 col-md-offset-1">
            <div class="post-preview">
                <h2 class="post-title">
                    {{object.content}}
                </h2>
                {% if object.image %}
                    <img src="{{object.image.url}}" width="300" height="200"/>
                {% endif %}
                <p class="post-meta">投稿時間:{{object.posted_date}}</p>
                <p class="post-meta">更新時間:{{object.updated_date}}</p>
            </div>
            {% if object.owner == user %}
            <a href="{% url 'update' object.id %}" class="btn btn-primary">編集</a>
            <a href="{% url 'delete' object.id %}" class="btn btn-danger">削除</a>
            {% endif %}
        </div>
    </div>
<br><hr><br>
    <div class="row">
        <h2>コメント一覧</h2>
        <a href="{% url 'reply' blog.pk %}">コメントする</a>
        <hr>
        <div class="col-lg-8 col-lg-offset-2 col-md-10 col-md-offset-1">
            <div class="post-preview">
                {% for reply in blog.reply_set.all %}
                <div style="margin-left:100px;">
                    名前:{{ reply.owner.username }}<br>
                    テキスト:{{ reply.content }}<br>
                    <hr>
                </div>
                {% endfor %}
            </div>
        </div>
    </div>
{% endblock %}

試したこと

BlogDetailViewにModelFormMixinを追加しましたが、解決しませんでした。

  • 気になる質問をクリップする

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

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

    クリップを取り消します

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

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

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

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

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

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

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

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

    質問の評価を下げる

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

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

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

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

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

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

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

    詳細な説明はこちら

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

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

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

回答 1

checkベストアンサー

0

related_name を削除すると表示されるようになったりしませんか?

  target = models.ForeignKey(Blog, on_delete=models.CASCADE)

投稿

  • 回答の評価を上げる

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

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

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

  • 回答の評価を下げる

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

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

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

  • 2020/01/20 20:11

    解決しました!
    ありがとうございます!!

    キャンセル

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

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