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

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

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

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

Python 3.x

Python 3はPythonプログラミング言語の最新バージョンであり、2008年12月3日にリリースされました。

Q&A

解決済

1回答

1004閲覧

pkの代わりにslugを使用したい

Sano

総合スコア19

Django

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

Python 3.x

Python 3はPythonプログラミング言語の最新バージョンであり、2008年12月3日にリリースされました。

0グッド

0クリップ

投稿2019/04/30 14:32

外部キーで参照したオブジェクトを取得するときに、pkを使うのではなく、slugを使って取得したいです。
Category,Postの2つのモデルがあります。
PostのcategoryではCategoryのnameを参照しています。

python

1class Category(models.Model): 210 311 name=models.CharField(max_length=220) 4 514 def __str__(self): 615 return self.name 7 822 def get_or_create_curry_category(): 923 category_list=["プログラミング", "料理", "映画", "制作物"] 1024 for i in category_list : 1125 category, _ = Category.objects.get_or_create(name=i ) 1226 return category 1327 1428 class Post(models.Model): 15 category=models.ForeignKey( 1648 Category, verbose_name="カテゴリ", on_delete=models.CASCADE, 1749 default=get_or_create_curry_category, 1850 )

python

1 #pkを使用してオブジェクトを抽出する ※動作済み 2 3 4 54 class CategoryListView(ListView): 5 55 6 56 model=Post 7 57 template_name="blog/post_list.html" 8 60 9 61 def get_queryset(self): 10 62 categorytest=get_object_or_404(Category, pk=self.kwargs['pk']) 11 63 return Post.objects.filter(category=categorytest).order_by('-published_date')

↑はpkを基準にpostを取り出した時のClassViewです。
pkを基準に特定のCategoryオブジェクトを取り出し、その特定のCategoryオブジェクトをcategoryとしているPostオブジェクトを渡すという処理を書いています。
オブジェクトを取り出す基準を変えるだけ(pk-->slug)で、同じ処理を書きたいと思っています。

python

1 #slugを設定してオブジェクトを抽出する ※正しく動かない 2 3 54 class CategoryListView(ListView): 4 55 5 56 model=Post 6 57 template_name="blog/post_list.html" 7 58 slug_url_kwarg="name" 8 59 slug_field = "name" 9 60 10 61 def get_queryset(self): 11 62 categorytest=get_object_or_404(Category, pk=self.kwargs['name']) 12 63 return Post.objects.filter(category=categorytest).order_by('-published_date')

pkを使用していた時と同じ書き方で、取得を試みましたが失敗しました。

python

1#エラーメッセージ 2NoReverseMatch at / 3Reverse for 'post_category' with arguments '('制作物',)' not found. 1 pattern(s) tried: ['category/(?P<name>[-a-zA-Z0-9_]+)/$']

正確に動いたもの、動かなかったもの それぞれの url template も記述します。

python

1 2#動作する 3path('category/<int:pk>/', CategoryListView.as_view(), name="post_category"), 4 5#動作しない 6path('category/<slug:name>/', CategoryListView.as_view(), name="post_category"), 7

HTML

1#動作する 2<p class="text"><a href="{% url 'blog:post_category' post.category.pk %}"><span class="category__icon">{{ post.category }}</span></a></p> 3 4#動作しない 5<p class="text"><a href="{% url 'blog:post_category' post.category.name %}"><span class="category__icon">{{ post.category }}</span></a><p>

どのように書けばslugを使用して正しく動作できるのでしょうか。
ご教授よろしくお願いいたします。

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

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

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

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

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

guest

回答1

0

ベストアンサー

ひとつには get_object_or_404() のキーワード引数のキーワードが違っているからではないでしょうか。

patch

1- categorytest=get_object_or_404(Category, pk=self.kwargs['name']) 2+ categorytest=get_object_or_404(Category, name=self.kwargs['name'])

また、 Category.name を slug として利用されたのであれば CharField ではなく SlugField を使われた方がよいのかなと思います。

公式ドキュメントの get_object_or_404() のところに具体的なサンプルがいくつか載っていますので、使い方がわからない場合はそちらをご覧になってみてください。

投稿2019/05/03 00:02

gh640

総合スコア1407

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

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

Sano

2019/05/08 14:52

アンサーの通りキーワード引数が間違っていました。 ありがとうございました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.50%

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

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

質問する

関連した質問