使用ListView的自定义ContextProcessor - 不显示在模板中

时间:2017-06-22 00:21:36

标签: python django django-class-based-views

几年后我回到django,我采用了基于类的视图 - 绝对是粉丝,但由于某种原因,我无法让我的自定义内容处理器显示其数据。我在我的应用程序中主要使用Generic Views,根据我的理解,他们应该自动为视图提供上下文。

这是我的上下文处理器(context_processors.py)

from models import Alert


def context_alerts(request):
    alert_list = {}
    alerts = Alert.objects.filter(to_user=request.user)

    alert_list['alerts'] = alerts
    alert_list['unread_count'] = len([a for a in alerts if a.unread == True])

    # printing to console - this works
    print alert_list

    return alert_list

请注意,当我打印字典时 - 它显示在我的控制台中,所以我知道它正在触发。

在我的设置中设置如此

TEMPLATES = [
    {
        'BACKEND': 'django.template.backends.django.DjangoTemplates',
        'DIRS': [],
        'APP_DIRS': True,
        'OPTIONS': {
            'context_processors': [
                'django.template.context_processors.debug',
                'django.template.context_processors.request',
                'django.contrib.auth.context_processors.auth',
                'django.contrib.messages.context_processors.messages',
                'part_iq.context_processors.context_alerts'
            ],
        },
    },
]

最后,这是一个示例视图 - 我有大约20个左右,所有基于标准类的视图:

class BuyerRfqList(ListView):
    context_object_name = "rfqs"
    template_name = "dashboard/buyer/rfq-list.html"

    def get_queryset(self):

        user = self.request.user
        rfqs = Rfq.objects.filter(from_user=user, hidden=False).order_by("created_at")

        return rfqs

我只是在模板中输出警报(同时尝试dict的名称和上下文处理器功能):

{{alert_list.unread_count}}
{{context_alerts.unread_count}}

没有运气。

我觉得这是显而易见的事情,但是我对Django来说太生气了,并且是ClassBasedViews的新手来解决这个问题

2 个答案:

答案 0 :(得分:1)

两个问题:

  1. 您的" alert_list"中没有名为"count"的密钥字典。该模板实际上被翻译为alert_list['count'](因为#2),它不存在,所以它只是无声地失败。

  2. 访问Django模板中的字典就好像它们是对象一样。

  3. 所以alert_list['alerts']

    相当于

    {{ alert_list.alerts }}

    现在您可以在Queryset上调用count

    {{ alert_list.alerts.count }}

答案 1 :(得分:0)

您在模板中没有任何名为alerts_list的内容。这只是您在函数内部使用的本地名称,用于保存变量的dict以传递给模板。该字典的内容将直接添加到上下文中:因此您可以访问{{ alerts }}{{ unread_count }}