2014-08-28 59 views
1

我有一個自定義上下文處理器,它將一些服務器端常量傳遞給客戶端(通過注入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'} }) 

,所以我有兩個問題

  1. 是Django文檔不正確的?從我的理解第二個 字典應該update第一個。根據這些發現我的 自定義上下文首先應用。

  2. 達到此目的的最佳方法是什麼?

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 %} 

回答

0

Django的工作作爲證明的解決方案。您的模板上下文處理器返回的params覆蓋視圖上下文中的params。 Django不會自動合併字典,只要你想。

而不是使用render快捷方式,您可以使您的意見返回TemplateResponse對象。然後,不要寫一個上下文處理器,而要編寫一箇中間件來更新​​方法中的params字典。

+0

中間件聽起來像個好主意 - 我使用'render',因爲它省去了在每次執行時傳遞上下文的麻煩 - 'render'和'TemplateResponse'之間的區別是什麼? – haki 2014-08-28 17:30:27

+0

'TemplateResponse'採用與渲染快捷方式相同的參數,但它允許您在呈現模板之前使用'process_template_response'中間件方法更新上下文。像'render'一樣,它使用'RequestContext'。 – Alasdair 2014-08-28 20:06:22

相關問題