2017-11-17 9 views
0

を取得する:ジャンゴ/セキレイ/ taggit - 私はこれを見ているモデル固有のタグリスト

Generating a unique list of Django-Taggit Tags in Wagtail;

やソリューションが発生しているなどのタグすべて保存されたタグのリスト、すなわち画像、文書、。

私は同様の目標を達成しようとしています。ニュースインデックスページには、ニュースページタグのドロップダウンリストがあります。

私はニュースページのタグだけであるタグのリストを得ることはできません。現在、これは画像タグとドキュメントタグを含む私のサイトのすべてのタグのリストを私に提供します。

from django.template.response import TemplateResponse 
from modelcluster.fields import ParentalKey, ParentalManyToManyField 
from modelcluster.tags import ClusterTaggableManager 
from taggit.models import TaggedItemBase, Tag 
from core.models import Page 

class NewsPageTag(TaggedItemBase): 
    content_object = ParentalKey('NewsPage', related_name='tagged_items') 


class NewsPage(Page): 
    tags = ClusterTaggableManager(through=NewsPageTag, blank=True) 


class NewsIndexPage(Page): 

    def serve(self, request, *args, **kwargs): 
     context['tags'] = Tag.objects.all().distinct('taggit_taggeditem_items__tag') 
     return TemplateResponse(
      request, 
      self.get_template(request, *args, **kwargs), 
      context 
     ) 

私も試してみました:

from django.contrib.contenttypes.models import ContentType 
# ... 
def serve(self, request, *args, **kwargs): 
    news_content_type = ContentType.objects.get_for_model(NewsPage) 
    context['tags'] = Tag.objects.filter(
     taggit_taggeditem_items__content_type=news_content_type 
    ) 
    return TemplateResponse(
     request, 
     self.get_template(request, *args, **kwargs), 
     context 
    ) 

context['tags']空のセット

マイテンプレート割り当てる:

{% if tags.all.count %} 
    {% for tag in tags.all %} 
     <a class="dropdown-item" href="?tag={{ tag.id }}">{{ tag }}</a> 
    {% endfor %} 
{% endif %} 

HELPを!これはそれほど複雑ではないように感じます。ありがとうございます

答えて

1

これはどのように達成されたかは、参考文献である新しいWagtail Bakery Demo applicationでコピーできます。

基本的にすべての子ページを取得してから、タグを取得するだけで、setを使用して、それらが一意のオブジェクトであることが保証されます。

最初にNewsIndexPageにメソッドを追加すると、これらのタグを一貫した方法で取得できます。

See: models.py

class NewsIndexPage(Page): 

    # Returns the list of Tags for all child posts of this BlogPage. 
    def get_child_tags(self): 
     tags = [] 
     news_pages = NewsPage.objects.live().descendant_of(self); 
     for page in news_pages: 
      # Not tags.append() because we don't want a list of lists 
      tags += page.get_tags 
     tags = sorted(set(tags)) 
     return tags 

あなたNewsPageIndexモデルのメソッドを持っているので、あなたは、このようなあなたのテンプレートで直接タグを取得することができ、serveメソッドをオーバーライドOは必要ありません。

{% if page.get_child_tags %} 
     {% for tag in page.get_child_tags %} 
      <a class="dropdown-item" href="?tag={{ tag.id }}">{{ tag }}</a> 
     {% endfor %} 
    {% endif %} 

はセキレイベーカリーデモのblog_index_page.html

ノートで同様のテンプレートアプローチを参照してください:あなたはまだserve方法でこのような何かを行うことによって、コンテキストに追加することができます。

context['tags'] = self.get_child_tags() 
+0

感謝を!これは素晴らしく、Wagtail Bakery Demoは非常に役に立ちます。 – JVsquad

関連する問題