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

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

ただいまの
回答率

88.61%

Djangoでカテゴリが上手くフィルターされない

解決済

回答 1

投稿 編集

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

trey_0329

score 107

Djangoにてブログを作成しております。

Blogの投稿記事に複数カテゴリを割り当て、カテゴリをクリックすると
そのカテゴリに紐づいた記事が見れる簡単な設定ですが、
なぜか英単語のみの組み合わせのカテゴリを作成、選択すると、同じ記事が複数回表示されてしまいます。

色々試してみましたが原因がわからず、こちらにて質問致しました。


カテゴリPerson2を選択した場合、下記のようにPerson2に紐づいたカテゴリが表示されます
イメージ説明

カテゴリPersonを選択した場合、なぜかPersonに紐づいた記事が、複数回表示されてしまいます
説明(3d1a2468977883603fce1711d0085f9a.jpeg)

しかし、登録している記事は3つしかありません
イメージ説明

下記、コードです
models.py

from django.db import models


class Category(models.Model):
    person = models.CharField(max_length=20)
    description = models.TextField()


class Post(models.Model):
    book_title = models.CharField(max_length=255)
    author = models.CharField(max_length=255)
    book_link = models.CharField(max_length=255)
    source = models.TextField()
    source_link = models.CharField(max_length=255)
    created_on = models.DateTimeField(auto_now_add=True)
    last_modified = models.DateTimeField(auto_now=True)
    categories = models.ManyToManyField("Category", related_name="posts")

views.py

from django.shortcuts import render
from blog.models import Post, Category


def blog_index(request):
    posts = Post.objects.all().order_by("-created_on")
    context = {"posts": posts}
    return render(request, "blog_index.html", context)


def blog_category(request, category):
    posts = Post.objects.filter(categories__person__contains=category).order_by(
        "-created_on"
    )

    context = {"category": category, "posts": posts}
    return render(request, "blog_category.html", context)


def blog_detail(request, pk):
    post = Post.objects.get(pk=pk)
    context = {"post": post}
    return render(request, "blog_detail.html", context)

html(blog_category.html)

{% extends "base.html" %}
{% block page_content %}
<div class="col-md-8 offset-md-2">
    <h1>{{ category | title }}</h1>
    <hr>
    {% for post in posts %}
        <h2><a href="{% url 'blog_detail' post.pk%}">{{ post.book_title }}</a></h2>
        <small>
            {{ post.created_on.date }} |&nbsp;
            Categories:&nbsp;
            {% for category in post.categories.all %}
            <a href="{% url 'blog_category' category.person %}">
                {{ category.person }}
            </a>&nbsp;
            {% endfor %}
        </small>
        <p>{{ post.source | slice:":400" }}...</p>
    {% endfor %}
</div>
{% endblock %}

おわかりの方いらっしゃいましたら是非ご教示お願い致します。

追記
personがCategoryモデルのpersonとかぶっているのかと重い、persoというタグを追加してみましたが、同じように同じ記事が複数回表示されます。
しかし、testというタグを使うと、同じ記事は表示されませんでした。

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

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

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

    クリップを取り消します

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

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

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

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

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

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

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

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

    質問の評価を下げる

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

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

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

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

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

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

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

    詳細な説明はこちら

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

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

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

回答 1

check解決した方法

+1

('-created_on').distinct()で解決しました

投稿

  • 回答の評価を上げる

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

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

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

  • 回答の評価を下げる

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

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

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

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

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

関連した質問

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