我有一個自定義上下文處理器,它將一些服務器端常量傳遞給客戶端(通過注入javascript對象)。有些視圖可能希望將其他參數,例如通知添加到字典中。Django - 更新視圖中的自定義上下文
from django.contrib.sites.shortcuts import get_current_site
def client_context(request):
params = {}
domain = get_current_site(request).domain
schema = request.scheme
params['rooturl'] = "%s://%s" % (schema,domain)
return {'params': params}
按照docs
當應用上下文處理器
語境處理器本身被處理的上下文之後施加。這意味着上下文處理器可能會覆蓋您提供給Context或RequestContext的變量,因此請注意避免與上下文處理器提供的變量名重疊的變量名。
如果我呈現一個模板沒有覆蓋params
它工作正常 - 我在模板中獲取baseurl。
如果我使用名爲params
的變量呈現模板,我只得到覆蓋值。
def home(request):
return render(request, 'home.html', { 'params' : {'page' : 'home'} })
,所以我有兩個問題
是Django文檔不正確的?從我的理解第二個 字典應該
update
第一個。根據這些發現我的 自定義上下文首先應用。達到此目的的最佳方法是什麼?
EDIT
以我base.html
文件(由所有其他模板延長)我通過params
對象到一個JS對象。 e.g
{% block init %}
<script>
Global = new Global({{ params | json }});
</script>
{% endblock %}
我希望這不會需要通過名稱
將每一個可能的參數{% block init %}
<script>
Global = new Global({ baseurl : "{{baseurl}}", page : "{{ page }}");
</script>
{% endblock %}
中間件聽起來像個好主意 - 我使用'render',因爲它省去了在每次執行時傳遞上下文的麻煩 - 'render'和'TemplateResponse'之間的區別是什麼? – haki 2014-08-28 17:30:27
'TemplateResponse'採用與渲染快捷方式相同的參數,但它允許您在呈現模板之前使用'process_template_response'中間件方法更新上下文。像'render'一樣,它使用'RequestContext'。 – Alasdair 2014-08-28 20:06:22