2017-06-20 58 views
2

在我們的應用程序之一(運行Django 1.8)中,我們傾向於通過將字典傳遞給render()函數的上下文參數來呈現模板,並將它們作爲視圖的一部分返回。例如:Django模板上下文對象的用途?

from django.views.generic import View 

class HomePageView(View): 

    def get(self, request, *args, **kwargs): 
     context = {'foo': 'bar', 'foo2': 'bar2'} 
     return render(request, "page.html", context) 

現在,我已經開始尋找它,我看到的使用Django「上下文」對象,而不是字典人們的例證。

from django.views.generic import View 
from django.template import Context 

class HomePageView(View): 

    def get(self, request, *args, **kwargs): 
     context = Context() 
     context['foo'] = 'bar' 
     context['foo2'] = 'bar2' 
     return render(request, "page.html", context) 

文檔顯示,該上下文對象可以以類似於字典(POP,複製,密鑰分配等)的方式進行交互,並且具有扁平化()方法,可以讓你把它比作一本字典。 https://docs.djangoproject.com/en/1.8/ref/templates/api/#playing-with-context

我的問題是:我有沒有任何理由要使用Context對象而不是字典?我可以看到有人可能會發現RequestContext的子類有用,如果他們想要容易訪問請求變量,但我認爲我缺少上下文對象的實用程序。

回答

4

Python字典是已知鍵和變量值之間的映射。 A Context()與字典類似,但Context()提供了附加功能。

所以,在渲染模板時,你需要一個上下文。這可能是django.template.Context的一個實例,但Django也帶有稍有不同的子類django.template.RequestContext

render()快捷方式會創建一個RequestContext,除非它明確傳遞了不同的上下文實例。

[...]

RequestContextcontext processors的建立是爲了解決冗餘問題。 Context processors可讓您指定在每個上下文中自動設置的變量數量,而無需在每個render()調用中指定變量。

[...]

  • 請記住,在任何TEMPLATE_CONTEXT_PROCESSORS背景處理器(在設置)將在由setteings文件prowered每個模板可用。

  • 自定義上下文處理器可以位於代碼庫中的任何位置。 Django所關心的是,如果您直接使用它,則TEMPLATES設置中的context_processors選項或Engine參數context_processors參數指向您的自定義上下文處理器。有了這個說法,公約就是將它們保存在您的應用程序或項目中名爲context_processors.py的文件中。

來源:掌握Django的:核心。完整的指南Django的1.8LTS

更多信息:official documentation: RequestContext

+1

唉唉我已經錯過了有關模板如何需要上下文對象,而是傳遞一個字典到渲染功能* *實例化一個RequestContext對象,如文檔中的行一條捷徑。很高興知道,謝謝! –