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

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

ただいまの
回答率

88.59%

Djangoでカテゴリーごとにページし、カテゴリーに一致している記事を表示させたい

受付中

回答 0

投稿

  • 評価
  • クリップ 0
  • VIEW 1,253

ysk1914

score 17

いつもお世話になります。
現在Djangoを使用して口コミサイトを開発しており、詰まったので質問させていただきます。

実現したいこと

  • 各カテゴリーのページを作成したい
  • 上記のカテゴリーページからカテゴリーのページに遷移し、そのカテゴリーに投稿された口コミを表示させたい

画面遷移の流れ

  1. トップページにアクセス
  2. カテゴリーボタンをクリック
  3. カテゴリ一覧に遷移
  4. カテゴリーをクリック(仮に「商品A」にします)
  5. 商品Aの詳細ページに遷移
  6. 商品Aカテゴリーに投稿された口コミ一覧を表示

投稿までの流れ

  1. トップページより投稿ボタンのクリック
  2. フォームから口コミ投稿するカテゴリーを選択し、投稿
  3. 紐づくカテゴリーページの一覧に表示

現状

カテゴリーの詳細ページまで作成したのですが、カテゴリー詳細ページにユーザーが投稿した口コミを表示させる方法が分からない状況です

model.py
from django.db import models
from django.utils import timezone
# カテゴリーモデル
class category(models.Model):
    class Meta:
        verbose_name = 'カテゴリー'

    # カラムの定義
    category_name = models.CharField(max_length=255, db_column='site_name', verbose_name='カテゴリー')

    def __str__(self):
        return self.category_name

# 投稿内容モデル
class contents(models.Model):
    class Meta:
        verbose_name = '投稿内容'

    # カラムの定義
    post_name = models.CharField(max_length=20, default='匿名', blank=False, null=False)
    category_name = models.ForeignKey(category, on_delete=models.CASCADE)
    price_score = models.CharField(max_length=10, blank=True, null=True)
    satisfaction_score = models.CharField(max_length=10, blank=True, null=True)
    course_score = models.CharField(max_length=10, blank=True, null=True)
    understand_score = models.CharField(max_length=10, blank=True, null=True)
    support_score = models.CharField(max_length=10, blank=True, null=True)
    good_point_contents = models.TextField(blank=True, null=True)
    bad_point_contents = models.TextField(blank=True, null=True)
    overall = models.TextField(blank=True, null=True)
    insert_ymd = models.DateTimeField(default=timezone.now)

    def __str__(self):
        return self.post_name

    def split_contens(self):
        return self.post_contents[:30]
urls.py
from django.urls import path
from .views import *

# app_nameはアプリケーション名
app_name = 'app'

urlpatterns = [
    path('', index_view.as_view(), name='index'),
    path('category/', category_view.as_view(), name='category'),
    path('category/<int:pk>', category_detail_view.as_view(), name='category-detail'),
    path('post/', create_view.as_view(), name='create'),
]
forms.py
from django import forms
from .models import contents

CHOICE = [
    ('1', 'かなり不満'),
    ('2', 'やや不満'),
    ('3', '普通'),
    ('4', 'やや満足'),
    ('5', 'かなり満足'),
]

class post_form(forms.ModelForm):

    post_name = forms.CharField(label='投稿者名', widget=forms.TextInput())
    price_score = forms.ChoiceField(label='料金', widget=forms.Select, choices=CHOICE, initial=2)
    satisfaction_score = forms.ChoiceField(label='満足度', widget=forms.Select, choices=CHOICE, initial=2)
    course_score = forms.ChoiceField(label='コース', widget=forms.Select, choices=CHOICE, initial=2)
    understand_score = forms.ChoiceField(label='分かりやすさ', widget=forms.Select, choices=CHOICE, initial=2)
    support_score = forms.ChoiceField(label='サポート', widget=forms.Select, choices=CHOICE, initial=2)
    good_point_contents = forms.CharField(label='良かった点', widget=forms.Textarea)
    bad_point_contents = forms.CharField(label='改善してほしい点', widget=forms.Textarea)
    overall = forms.CharField(label='総合評価', widget=forms.Textarea)


    class Meta:
        model = contents
        fields = ('post_name', 'category_name', 'price_score', 'satisfaction_score',
                  'course_score', 'understand_score',
                  'support_score', 'good_point_contents', 'bad_point_contents',
                  'overall')

views.py

from django.shortcuts import render
from django.views import generic
from .forms import post_form
from .models import contents, category
from django.urls import reverse_lazy

# Create your views here.

class index_view(generic.TemplateView):
    template_name = 'app/index.html'

class create_view(generic.CreateView):
    template_name = 'app/post-study-site.html'
    model = contents
    form_class = Study_site_post_form
    success_url = reverse_lazy('app:index')

class category_view(generic.ListView):
    model = category
    template_name = 'app/category.html'

class category_detail_view(generic.DetailView):
    model = category
    template_name = 'app/category-detail.html'
category.html
{% extends 'base.html' %}
{% load widget_tweaks %}

{% block title %}トップ{% endblock %}

{% block contents %}
    <div>
    カテゴリー
    {% for list in object_list %}
        <a href="{% url 'app:category-detail' list.pk %}">{{ list.category_name }}</a>
    {% endfor %}
    </div>
{% endblock %}
category-detail.html
{% extends 'base.html' %}
{% load widget_tweaks %}

{% block title %}トップ{% endblock %}

{% block contents %}
    <div>
    カテゴリー詳細
    </div>
{% endblock %}

イメージ図

イメージ説明

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

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

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

    クリップを取り消します

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

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

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

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

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

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

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

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

    質問の評価を下げる

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

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

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

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

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

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

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

    詳細な説明はこちら

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

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

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

まだ回答がついていません

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

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

関連した質問

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