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

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

新規登録して質問してみよう
ただいま回答率
85.35%
Django

DjangoはPythonで書かれた、オープンソースウェブアプリケーションのフレームワークです。複雑なデータベースを扱うウェブサイトを開発する際に必要な労力を減らす為にデザインされました。

Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

Q&A

解決済

1回答

923閲覧

Django: ブログのカテゴリー機能がうまく動かない。

Kazuhiro-ch

総合スコア85

Django

DjangoはPythonで書かれた、オープンソースウェブアプリケーションのフレームワークです。複雑なデータベースを扱うウェブサイトを開発する際に必要な労力を減らす為にデザインされました。

Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

0グッド

0クリップ

投稿2021/08/31 01:05

編集2021/09/01 04:13

DjangoCMSであるwagtailを使用して、1つのアプリを開発しています。その中でブログも追加し、そのブログに対してカテゴリー機能を実装したいです。現在、すでに実装はされていおり。管理者画面のスニペットからカテゴリーの登録、カテゴリーの表示、適切なクエリの表示までできています。しかし、そのカテゴリーを押すとしっかりとクエリに反映されるのですが、カテゴリー分けされたブログ記事は表示されません。これを直したいです。

追記:
じぶんで再考しコードを書き換えました。

def get_context(self, request, *args, **kwargs): """Adding custom stuff to our context.""" context = super().get_context(request, *args, **kwargs) context["categories"] = BlogCategory.objects.all() category = BlogCategory.objects.get(slug=slug) # もしカテゴリーの指定があればカテゴリーと紐づいた記事のみ表示 if category: context["posts"] = BlogDetailPage.objects.live().public().filter(categories__in=[category]) # もしカテゴリー指定がなければ→すべての記事を表示 else: context["posts"] = BlogDetailPage.objects.live().public() return context

エラーとしてslugが定義されていませんと表示されます。defないで再定義する必要があるのでしょうか?

以下のコードが原因となるものです。

python

1#models.py 2 3from django.db import models 4from django import forms 5from modelcluster.fields import ParentalManyToManyField 6from wagtail.admin.edit_handlers import FieldPanel, StreamFieldPanel, MultiFieldPanel 7from wagtail.core.fields import StreamField 8from wagtail.core.models import Page 9from wagtail.images.edit_handlers import ImageChooserPanel 10from wagtail.snippets.models import register_snippet 11 12from streams import blocks 13 14@register_snippet 15class BlogCategory(models.Model): 16 """Blog category for a snippet.""" 17 18 name = models.CharField(max_length=255) 19 slug = models.SlugField( 20 verbose_name="slug", 21 allow_unicode=True, 22 max_length=255, 23 help_text='A slug to identify posts by this category', 24 ) 25 26 panels = [ 27 FieldPanel("name"), 28 FieldPanel("slug"), 29 ] 30 31 class Meta: 32 verbose_name = "Blog Category" 33 verbose_name_plural = "Blog Categories" 34 ordering = ["name"] 35 36 def __str__(self): 37 return self.name 38 39 40class BlogListingPage(Page): 41 42 template = "blog/blog_listing_page.html" 43 44 blog_title = models.CharField( 45 max_length=100, 46 blank=True, 47 null=True, 48 help_text='Overwrites the default title', 49 ) 50 51 content_panels = Page.content_panels + [ 52 FieldPanel("blog_title"), 53 ] 54 55 def get_context(self, request, *args, **kwargs): 56 """Adding custom stuff to our context.""" 57 context = super().get_context(request, *args, **kwargs) 58 context["posts"] = BlogDetailPage.objects.live().public() 59 context["categories"] = BlogCategory.objects.all() 60 return context 61 62 63class BlogDetailPage(Page): 64 """Blog detail page.""" 65 66 template = "blog/blog_detail_page.html" 67 blog_title = models.CharField( 68 max_length=100, 69 blank=False, 70 null=False, 71 help_text='Overwrites the default title', 72 ) 73 blog_image = models.ForeignKey( 74 "wagtailimages.Image", 75 blank=False, 76 null=True, 77 related_name="+", 78 on_delete=models.SET_NULL, 79 ) 80 categories = ParentalManyToManyField("blog.BlogCategory", blank=True) 81 content = StreamField( 82 [ 83 ("title_and_text", blocks.TitleAndTextBlock()), 84 ("full_richtext", blocks.RichtextBlock()), 85 ], 86 null=True, 87 blank=True, 88 ) 89 90 content_panels = Page.content_panels + [ 91 FieldPanel("blog_title"), 92 ImageChooserPanel("blog_image"), 93 StreamFieldPanel("content"), 94 MultiFieldPanel( 95 [ 96 FieldPanel("categories", widget=forms.CheckboxSelectMultiple) 97 ], 98 heading="Categories" 99 ), 100 ] 101

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

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

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

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答1

0

自己解決

Migrationを削除したらできました

投稿2022/05/20 07:31

Kazuhiro-ch

総合スコア85

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.35%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問