2017-07-17 26 views
0

我是Django的新手,正在用這個框架開發我的第一個網站。此類網站的所有部分都必須在屏幕右上方顯示其社交網絡鏈接。爲了做到這一點,我在models.py中製作了兩個字段:社交網絡鏈接和fontawesome圖標。如何用django在網站的所有部分顯示一些數據?

網站的每個部分都使用模板呈現,所有模板僅從一個基本模板擴展而來。該基本模板是必須包含社交網絡鏈接的人

我知道如何在所有部分顯示這些鏈接的唯一方法是將它們傳遞給每個視圖中的模板。這違背了DRY(不要重複自己)規則。有沒有辦法只傳遞一次,並讓所有網站都可見?

回答

0

Writing your own context processors

有隻有兩個規則是有...

  1. 只有一個參數就是request
  2. 必須返回字典

context_processors.py

def database_social_links(request): 
    social_links = SocialLinks.objects.all() 
    return {'social_links': social_links } 

更新您的settings.py遵循

TEMPLATES = [ 
    { 
     'BACKEND': 'django.template.backends.django.DjangoTemplates', 
     'DIRS': [ 
      # insert your TEMPLATE_DIRS here 
     ], 
     'APP_DIRS': True, 
     'OPTIONS': { 
      'context_processors': [ 
       # Insert your TEMPLATE_CONTEXT_PROCESSORS here or use this 
       'your_app.context_processors.database_social_links', 
       # list if you haven't customized them: 
       'django.contrib.auth.context_processors.auth', 
       'django.template.context_processors.debug', 
       'django.template.context_processors.i18n', 
       'django.template.context_processors.media', 
       'django.template.context_processors.static', 
       'django.template.context_processors.tz', 
       'django.contrib.messages.context_processors.messages', 
      ], 
     }, 
    }, 
] 

而在你的base.html文件或任何...

{% for links in social_links %} 
    {{ link.name }} {{ link.font_awesome }} 
{% endfor %} 
+0

謝謝您的回答拉賈!所以你說我不需要通過「views.py」傳遞這些數據? – Captain

+0

是的,沒錯。查看自定義上下文處理器的概念是在未提及的情況下執行視圖時向數據定義的字典注入。這樣可以在每個模板中使用。 –

+0

但是你從數據庫中檢索它,所以要小心這個縮放和所有的東西。每頁請求都會從數據庫獲取值,如果你問我,我最好避免這種情況。相反,我會使用redis像數據庫更好地獲得... :) –

相關問題