【问题标题】:Django - update custom context in viewDjango - 在视图中更新自定义上下文
【发布时间】:2014-08-28 13:43:44
【问题描述】:

我有一个自定义上下文处理器,它将一些服务器端常量传递给客户端(通过注入 javascript 对象)。某些视图可能希望向字典添加额外的参数,例如通知。

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

应用上下文处理器时

上下文处理器在上下文本身被处理后应用。这意味着上下文处理器可能会覆盖您提供给上下文的变量或 RequestContext,因此请注意避免与 那些由你的上下文处理器提供的。

如果我在不覆盖 params 的情况下呈现模板,它工作正常 - 我在模板中获得了 baseurl。

如果我使用名为 params 的变量渲染模板,我只会得到覆盖的值。

def home(request):  
    return render(request, 'home.html', { 'params' : {'page' : 'home'} })

所以我有两个问题

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

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

编辑

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

【问题讨论】:

    标签: django


    【解决方案1】:

    Django 正在按照文档中的方式工作。模板上下文处理器返回的params 覆盖了视图上下文中的params。 Django 不会根据需要自动合并字典。

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

    【讨论】:

    • 中间件听起来是个好主意 - 我正在使用 render 因为它省去了在每次执行时传递上下文的麻烦 - renderTemplateResponse 之间有什么区别?
    • TemplateResponse 采用与渲染快捷方式相同的参数,但它允许您使用 process_template_response 中间件方法在模板渲染之前更新上下文。与render 一样,它使用RequestContext
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-08-16
    • 1970-01-01
    相关资源
    最近更新 更多