Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/django/21.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 如何将变量传递给django中的所有模板?_Python_Django_Templates_View_Base - Fatal编程技术网

Python 如何将变量传递给django中的所有模板?

Python 如何将变量传递给django中的所有模板?,python,django,templates,view,base,Python,Django,Templates,View,Base,我正在尝试将变量(浏览器变量)传递到我应用程序中的所有模板。关于如何让它工作有什么建议吗 视图: 模板: {% for prod in browser %} {{ prod }}, {% endfor %} 目前,您正在将locals()作为变量范围传递,该变量范围还应包括browser,但我发现locals()的用法非常难看 就我个人而言,我总是喜欢这样的模式: def browser(request): context = RequestContext(request)

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

视图:

模板:

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

目前,您正在将
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)

我的朋友,您正在寻找上下文处理器。

出自一位比我更敏捷、更博学的技术作家之手:

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

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

您可以通过以下两种方式之一执行此操作:

  • 基于单个请求:通过将自定义的
    上下文
    值传递给您的
    render\u to\u response()
    调用
  • 全局:通过创建上下文处理器方法,该方法接受
    HttpRequest
    对象作为输入,并返回有效负载或回调,然后 在
    settings.py
    中注册上下文处理器,然后使用内置的
    RequestContext
    属性提供
    render\u to\u response()
    调用 而不是您自己的(当然,您可以随时扩展
    RequestContext
    以根据单个请求添加更多数据)
如果这种将数据传递给模板的方法对您来说听起来荒谬而混乱,那么您并不孤单。如此简单的操作所涉及的复杂性是毫无根据的,而且适得其反,但每个系统都有其缺点

官方文件如下:

所以,是的,我已经用Django编程一段时间了,我非常喜欢解决问题的原因之一是因为它的复杂性几乎是拜占庭式的,但不是以一种霸道的方式。它有大量的极客和玩偶,可能不会立即显得有用;当你需要的时候,它们中的每一个都会非常方便,如果不需要的话,它们都不会妨碍你


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

我可以给你一个代码示例,效果很好。下面是名为
context\u processors.py的文件:

上下文处理器.py 这就是我的base.html(我在所有页面上使用的模板)的一部分

base.html
{%if user.username%}
欢迎{{user.username}

这似乎不起作用……base.html仍然没有显示任何内容。@sharataka:在这种情况下,列表可能只是空的?如果您这样做会怎么样:
browser=['spam','eggs']
?我不确定这是否与此有关,但奇怪的是,您的函数名为
browser
,并且您还分配了一个名为
browser
的变量。我在python shell中做了一些实验,这似乎不是问题所在,但您可能希望对其进行更改以减少混淆。另外,请确保列表不是空的。尝试使用调试器或在视图中打印值。而且,您是否真的想知道如何在所有模板中显示变量,或者在这种情况下,
浏览器
变量为什么不工作?@BrianNeal我最初想知道为什么浏览器变量没有传递到base.html。这将有效地允许我在所有模板中使用变量,这正是我想要做的。这不是OP要求的吗?。。。我倾向于同意个人层面的观点,因为我通常不这样工作。但我不能肯定这两种方式,所以最好把它作为程序员的冒险,这种教育经历远远超过了我所能做出的任何评论。不管怎样,这就是为什么我在最后添加了¨,因为Q听起来像是在探索框架和解决特定的技术问题。
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)
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,
        }
{% if user.username %}
                    <h3>
                        Welcome {{ user.username }}
                    </h3>