我有一个自定义上下文处理器,它将一些服务器端常量传递给客户端(通过注入javascript对象)。某些视图可能希望在dict中添加其他参数,例如通知。
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文档不正确吗?从我理解的第二个
dict应update
第一个。根据这些发现我的
首先应用自定义上下文。
实现这一目标的最佳方法是什么?
修改
在我的base.html
文件中(由所有其他模板扩展)我将params
对象传递给Js对象。例如
{% block init %}
<script>
Global = new Global( {{ params | json }} );
</script>
{% endblock %}
我希望找到一个不需要按名称添加每个可能参数的解决方案
{% block init %}
<script>
Global = new Global( { baseurl : "{{baseurl}}", page : "{{ page }}" );
</script>
{% endblock %}
答案 0 :(得分:1)
Django正在记录中。模板上下文处理器返回的params
将覆盖视图上下文中的params
。 Django不会根据需要自动合并字典。
您可以使视图返回TemplateResponse
个对象,而不是使用render
快捷方式。然后,编写一个中间件,而不是编写上下文处理器,以更新process_template_response
方法中的params
dict。