外部キーで参照したオブジェクトを取得するときに、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を使用して正しく動作できるのでしょうか。
ご教授よろしくお願いいたします。
回答1件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2019/05/08 14:52