如何使用 CBV 在我的所有 Django 模板中创建侧边栏?

How can I create a sidebar in all my Django templates using CBV?

我的问题是我需要在我的所有页面上列出动态标签以及该页面上的所有 post(一个 post)内容。如何使用基于 Class 的视图在所有页面上包含标签侧边栏?谢谢

编辑: 标签列表必须按使用频率排序。 我的代码:

class AllTagCloudView(ListView):
    model = Tag
    template_name = 'tag_cloud.html'
    context_object_name = 'tag_cloud'

    def get_queryset(self):
        qs = Tag.objects.values("name", "slug").annotate(Count("post")).order_by('-post__count')
        return qs

我尝试使用

@register.inclusion_tag('tag_cloud.html', takes_context=True)
def sidebar_sorted_tags(context):

但我不知道如何让它工作。

我也试过使用 {% include 'tag_cloud.html' %}:

<div>
    <p>Tags</p>
    {% for tag in tag_cloud %}
        <ul>
            <li><a href="/tag/{{ tag.get_absolute_url }}">{{ tag.name }}</a></li>
        </ul>
    {% empty %}
        <a href="">There is no tags yet</a>
    {% endfor %}
</div>

我认为这是愚蠢的事情或者我做错了什么。

此任务与基于 class 的视图无关。您需要使用自定义 inclusion template tag.

@register.inclusion_tag('tag_cloud.html')
def sidebar_sorted_tags():
    return {'tag_cloud': Tag.objects.values("name", "slug")
                            .annotate(Count("post")).order_by('-post__count')}

现在在您的 base.html 模板中写入:

{% load my_tags %}

{% sidebar_sorted_tags %}

您可以在模板标签中使用 context processors and global base template that all of your other templates will extend. Also you can use simple include 而不是全局基本模板。