【问题标题】:How do I pass variables to all templates in django? [duplicate]如何将变量传递给 django 中的所有模板? [复制]
【发布时间】:2012-08-15 08:48:44
【问题描述】:

我正在尝试将变量(浏览器变量)传递给我应用程序中的所有模板。关于如何让它工作的任何建议?

查看:

def browser(request):
    primary_cat_list = Categories.objects.order_by("category")
    subcat_list = SubCategories.objects.order_by("sub_category")
    product = Productbackup.objects.order_by("website")
    browser =  list(chain(primary_cat_list, subcat_list, product))
    return render_to_response('reserve/templates/base.html', locals(), context_instance=RequestContext(request))

模板:

{% for prod in browser %} {{ prod }}, {% endfor %}

【问题讨论】:

  • 我不确定这是否与它有关,但奇怪的是您的函数名为browser,并且您还分配了一个名为browser 的变量。我在 python shell 中做了一些实验,这似乎不是问题,但您可能希望对其进行更改以减少混乱。
  • 还要确保您的列表不为空。尝试使用调试器或打印视图中的值。
  • 而且,您真的要问如何让变量显示在所有模板中,或者为什么在这种特殊情况下 browser 变量不起作用?
  • @BrianNeal 我最初想知道为什么没有将浏览器变量传递给 base.html。这将有效地允许我在所有模板中使用该变量,这正是我想要做的。

标签: python django templates view base


【解决方案1】:

目前您将locals() 作为变量范围传递,其中也应包括browser,但我发现locals() 的使用非常难看。

我个人更喜欢这样的模式:

def browser(request):
    context = RequestContext(request)

    primary_cat_list = Categories.objects.order_by("category")
    subcat_list = SubCategories.objects.order_by("sub_category")
    product = Productbackup.objects.order_by("website")
    browser =  list(chain(primary_cat_list, subcat_list, product))

    context['browser'] = browser

    return render_to_response('reserve/templates/base.html', context_instance=context)

【讨论】:

  • 这似乎不起作用...base.html 仍然没有显示任何内容。
  • @sharataka:在这种情况下,列表可能只是空的?如果你做这样的事情怎么办:browser = ['spam', 'eggs']
【解决方案2】:

您,我的朋友,正在购买上下文处理器。

来自a blog entry 的作者是一位比我更敏捷和博学的技术作家:

什么是模板上下文处理器?

Django 的上下文处理器是一种允许您向模板提供数据和回调的工具。

您可以通过以下两种方式之一这样做:

  • 基于单个请求:将自定义 Context 值传递给您的 render_to_response() 调用
  • 全局:通过创建一个上下文处理器方法,该方法接受 HttpRequest 对象作为输入,并返回有效负载或回调,然后 在您的settings.py 中注册上下文处理器,然后为您的render_to_response() 调用提供内置RequestContext 属性 而不是您自己的(当然,您可以随时扩展 RequestContext 以根据个人请求添加更多数据)。

如果将数据传递给模板的这种方法对您来说听起来很荒谬和难以理解,那么您并不孤单。如此简单的操作所涉及的复杂性是没有根据的,而且会适得其反,但每个系统都有其缺点。

官方文档在这里:

https://docs.djangoproject.com/en/dev/ref/templates/api/

但是,是的,我用 Django 编程已经有一段时间了,我真正喜欢用它解决问题的原因之一是它的复杂性几乎是拜占庭式的,但不是以一种霸道的方式。它有很多可能不会立即看起来有用的东西。当您需要时,它们中的每一个都非常方便,如果不需要,它也不会妨碍您。

这里的结果是:上下文处理器就是一个很好的例子。是的。

【讨论】:

  • 这不是 OP 所要求的吗?...我倾向于同意个人层面的过度杀伤力,因为我通常不会以这种方式工作。但我不能肯定地说,所以最好把它当作程序员的冒险,它的教育经验远远超过我能做的任何 cmet。无论如何,这就是我在末尾添加 ¶ 的原因,因为 Q 听起来像是在探索框架以及解决特定技术问题的人。
【解决方案3】:

我可以给你一个我的代码示例,它工作正常。这是名为context_processors.py的文件:

context_processors.py

def base(request):
    user = request.user

#======================
#Login form
#=====================

# here is the code for login user or check if he is logged in already

return  {
        'user': user,
        }

那是我的 base.html 的一部分(我在所有页面中都使用的模板)

base.html

{% if user.username %}
                    <h3>
                        Welcome {{ user.username }}
                    </h3>

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2019-04-03
    • 1970-01-01
    • 2014-11-30
    • 1970-01-01
    • 2015-06-22
    • 2015-08-10
    • 1970-01-01
    • 2020-04-24
    相关资源
    最近更新 更多