【问题标题】:django-taggit create tagcloud from querysetdjango-taggit 从查询集创建 tagcloud
【发布时间】:2012-05-28 10:21:59
【问题描述】:

我找不到这个问题的答案.. 所以这里是我的问题。对于一个新项目,我想使用django-taggit

有人对如何根据当前查询集创建标签云有建议吗?

所需的行为是从未过滤的列表“开始” - 然后允许通过应用过滤器和标签来缩小结果范围。在开始时,标签云显示例如50 个最常见的标签。选择标签(或其他标准)后,标签云应该只显示剩余的可能性。

我知道django-tagging 针对这种情况提供了 Tag.objects.usage_for_queryset()。但我更喜欢使用 '-taggit' 而不是 '-tagging'。

【问题讨论】:

    标签: django django-queryset django-taggit


    【解决方案1】:

    django-taggit-templatetags 似乎是 django-taggit 的 tagcloud 的“首选”位置。

    但它似乎无法处理查询集。 :(

    所以,我添加了:

    @register.inclusion_tag('taggit_templatetags/tagcloud_include_qs.html')
    def include_tagcloud_qs(queryset):
        try:
            queryset = queryset.annotate(num_times=Count('taggeditem_items'))
        except FieldError:
            queryset = queryset.annotate(num_times=Count('taggit_taggeditem_items'))
    
        num_times = queryset.values_list('num_times', flat=True)
    
        weight_fun = get_weight_fun(T_MIN, T_MAX, min(num_times), max(num_times))
        queryset = queryset.order_by('name')
        for tag in queryset:
            tag.weight = weight_fun(tag.num_times)
    
        return {"tags": queryset}
    

    templatetags/taggit_extras.py
    

    这是一个位于 taggit_templatetags/tagcloud_include_qs.html 的新文件

    <div>
    {% for tag in tags %}
    <font size={{tag.weight|floatformat:0}}>{{tag}}</font> 
    {% endfor %}
    </div>
    

    我在我的模板中这样使用它:

    {% include_tagcloud_qs my_queryset %}
    

    我没有花太多时间查看 django-taggit-templatetags 代码,所以请随时用更好的解决方案更新它!

    PS:

    我在我的视图中得到一个查询集,如下所示:

    my_queryset = Tag.objects.filter(foo__bar=baz).distinct()
    

    【讨论】:

    • 您能添加一张屏幕截图吗?
    【解决方案2】:

    This answer 展示了如何构建标签云。您将根据您的参数在视图中创建一个查询集,生成一个字典,并将其呈现在您的模板中,如该答案所示。

    【讨论】:

      【解决方案3】:

      我建议使用 django-tagging。这是有据可查的。我用它创建了标签云。您可以通过易于加载的模板标签通过模型、模型实例等访问标签云。这有点骇人听闻,但是使用 .counts 方法,您可以修改一些 css 来增加每种字体的大小,就像您在真实的标签云中看到的那样。 Django 标记实际上在这方面表现出色,因为它有一个默认模板标记,其中包含您所描述的所有内容的格式选项。

      【讨论】:

      • 是的,也许我必须使用 django-tagging。只是我在许多其他项目中使用 *-taggit。而且唯一缺少的东西(usage_for_queryset)在 *-tagging 中似乎相当有问题:goo.gl/gjmNV
      • 我假设既然您正在寻找查询集的使用,那么您希望从各种对象中检索标签并将它们组装在一个地方。如果是这种情况,我会编辑我的问题以反映这一点,并可能包括您正在使用的视图和模型。这是查询集 api 文档 docs.djangoproject.com/en/dev/ref/models/querysets 。模板标签可能会有所帮助。请注意,拥有 ListView.as_view(model=Author) 与定义查询集 Author.objects.all() 相同。当您在模型实例中时,您可以访问 Model.entry_set
      【解决方案4】:

      我在https://github.com/twig/django-taggit/commit/42cd4e04f00496103f295c0afd8297074be50dcf中添加了一个 TagBase.get_for() 函数

      这基本上获取用于给定查询集的标签,然后您可以从那里做您需要做的事情。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2011-09-27
        • 2015-11-28
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2016-02-21
        • 1970-01-01
        相关资源
        最近更新 更多