##やりたい事
都道府県ごとの店舗一覧リストを作りました。
その中に、タグ機能を付けました。
都道府県+タグで絞り込まれた店舗の数を表示したいです。
イメージはこちらのようなものです。
一覧ページがあって、ページ左側にタグ(人気のこだわり条件)があって、タグの右側に数字が書かれています。
###書いたコード
urls.py
python
1 2urlpatterns = [ 3 //省略// 4 path('<str:prefecture>/store-list/tag/<int:tag_id>/', PrefectureStoreList.as_view(), name='prefecture_tag'), 5 path('<str:prefecture>/store-list/', PrefectureStoreList.as_view(), name='prefecture'), 6 //省略// 7]
以下のように、店舗と都道府県はForeignKeyで、店舗とタグはManyToManyFieldでつないでいます。
(都道府県の下に市区町村モデルなどもありますが、不要そうなところは、省略してあります。)
models.py
class Prefecture(models.Model): name = models.CharField(verbose_name='都道府県名', max_length=20) url_name = models.CharField(verbose_name='URL用都道府県名', max_length=20) def __str__(self): return self.name class Meta: verbose_name = '都道府県名' verbose_name_plural = '都道府県名' ordering = ['pk'] class Store(models.Model): name = models.CharField(verbose_name='店舗名', max_length=100) prefecture = models.ForeignKey( Prefecture, verbose_name='県名', on_delete=models.PROTECT,) tags = models.ManyToManyField(Tag, verbose_name='タグ', blank=True) //省略// class Tag(models.Model): name = models.CharField(verbose_name='タグ名', max_length=20) def __str__(self): return self.name class Meta: verbose_name = 'タグ' verbose_name_plural = 'タグ'
店舗一覧画面のビューは、以下の通りです。
views.py
class PrefectureStoreList(ListView): model = Store template_name = 'myapp/prefecture_list.html' paginate_by = 10 def get_context_data(self, **kwargs): context = super().get_context_data(**kwargs) prefecture = self.kwargs.get('prefecture') context['prefecture'] = Prefecture.objects.get(url_name=prefecture) context['tags'] = Tag.objects.all() return context def get_queryset(self): queryset = super().get_queryset() prefecture = self.kwargs.get('prefecture') tags = self.kwargs.get('tag_id') queryset = queryset.filter(prefecture__url_name=prefecture) if tags: queryset = queryset.filter(tags=tags) return queryset
get_querysetを上書きし、全ての店舗一覧から、特定の都道府県の店舗に絞り込んでいます。
また、アクセスしたURLの中にtag_idがあれば、そのタグの条件に合った店舗に絞り込んでいます。
/tokyo/store-list/にアクセスすると、東京の店舗一覧が表示されます。
/tokyo/store-list/tag/1にアクセスすると、東京のタグ1の特性を持った店舗一覧が表示されます。
ここまでは何の問題もありません。
prefecture_list.html
html
1(不要そうなので省略) 2<!--左側のタグを特定する箇所--> 3<h4 class="side-headline">タグから探す</h4> 4<ul class="side-ul"> 5 {% for tag in tags %} 6 {% if tag.store_set.count > 0 %} 7 <li><a href="{% url 'myapp:prefecture_tag' prefecture.url_name tag.pk %}">{{tag}}({{tag.store_set.count}})</a></li> 8 {% endif %} 9 {% endfor %} 10</ul> 11(不要そうなので省略)
エラー・わからないこと
{{tag.store_set.count}}としているところが期待通りに動きません。
◆自分の期待している結果
/tokyo/store-list/にアクセスをした時に、
{{tag.store_set.count}}の結果として、東京にあって、かつ、タグ1の条件を持つ店舗数を表示したい。
◆予期せず返ってくる値
タグ1の条件を持った、全国の店舗数が返ってくる。
{{prefecture.store_set.count}}は東京にある全ての店舗が返ってきてしまいます。
自分の期待している結果を得るためには、どのようにすれば良いのでしょうか?
タグ1の特性を持った東京の店舗だけであれば、ビューの中で絞り込めそうですが、
{% for tag in tags %}の中の、tagそれぞれにあった店舗数を絞りこみたいので、少し難しいです。
お分かりになる方、アドバイスいただけましたら幸いです。
回答1件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。