2017-06-22 51 views
0

幾年後,我回到了django,我採用了基於類的視圖 - 絕對是粉絲,但由於某種原因,我無法讓我的自定義內容處理器顯示其數據。我在我的應用程序中主要使用了泛型視圖,並且根據我的理解,它們應該自動爲視圖提供上下文。使用ListView的自定義ContextProcessor - 未在模板中顯示

這是我的背景處理器(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 

我只需輸出模板中的警報(嘗試使用字典的名稱和上下文處理器功能):

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

沒有運氣。

我覺得這東西很明顯,但我太生疏瓦特/ Django和新ClassBasedViews弄明白

回答

1

兩個問題:

  1. 沒有名爲"count"關鍵的「alert_list」字典。該模板實際上被翻譯爲alert_list['count'](因爲#2),因爲它不存在,所以它只是失敗而已。

  2. 在Django模板中的字典被訪問,就好像它們是對象一樣。

所以alert_list['alerts']

相當於

{{ alert_list.alerts }}

現在你只需撥打count在查詢集

{{ alert_list.alerts.count }}

+0

感謝您的回覆,但我很抱歉 - 我搞砸了我的第一個問題,我實際上在我的模板(編輯)中將其作爲{{alert_list.unread_count}}。計數的目的是爲那些未讀(相對於查詢集中的所有內容)。+1作爲答案 – picus

0

您沒有任何物品在模板中稱爲alerts_list。這只是你在函數內部使用的局部名稱來保存變量的字典傳遞給模板。該字典的內容直接添加到上下文中:因此您可以訪問{{ alerts }}{{ unread_count }}

相關問題