Django - 在视图中更新自定义上下文

时间:2014-08-28 13:43:45

标签: django

我有一个自定义上下文处理器,它将一些服务器端常量传递给客户端(通过注入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'} })

所以我有两个问题

  1. django文档不正确吗?从我理解的第二个 dict应update第一个。根据这些发现我的 首先应用自定义上下文。

  2. 实现这一目标的最佳方法是什么?

  3. 修改

    在我的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 %}
    

1 个答案:

答案 0 :(得分:1)

Django正在记录中。模板上下文处理器返回的params将覆盖视图上下文中的params。 Django不会根据需要自动合并字典。

您可以使视图返回TemplateResponse个对象,而不是使用render快捷方式。然后,编写一个中间件,而不是编写上下文处理器,以更新process_template_response方法中的params dict。