1

使用Django 调试工具栏,我可以转到“模板”面板并单击“切换上下文”链接以随时查看上下文。

这些中的每一个都显示了多个字典,例如:

{'False': False, 'None': None, 'True': True}
{'DEFAULT_MESSAGE_LEVELS': {'DEBUG': 10,
                            'ERROR': 40,
                            'INFO': 20,
                            'SUCCESS': 25,
                            'WARNING': 30},
 'csrf_token': <SimpleLazyObject: 'zJvE5t6k9KdxMfUmU4SOvRTOC2rh7Pvw'>,
 'debug': True,
 'messages': <django.contrib.messages.storage.fallback.FallbackStorage object at 0x10877b860>,
 'perms': <django.contrib.auth.context_processors.PermWrapper object at 0x10877de10>,
 'request': '<<request>>',
 'sql_queries': <function debug.<locals>.<lambda> at 0x108d3de18>,
 'user': <SimpleLazyObject: <User: phil>>}
{'is_paginated': True,
 'object_list': '<<queryset of twitter.Tweet>>',
 'page_obj': <Page 1 of 330>,
 'paginator': <ditto.ditto.paginator.DiggPaginator object at 0x10877bac8>,
 'view': <ditto.twitter.views.TweetList object at 0x108782dd8>}

这里显示的三个不同的字典是什么?为什么没有一个?

4

1 回答 1

2

Django 模板有一个叫做作用域的东西。每个作用域都是一层变量,仅在当前作用域和所有子作用域中可用。

每个负责渲染模板的“层”都会添加自己的范围。默认情况下有 3 个作用域:根作用域,其中将定义一些常量变量:

{'False': False, 'None': None, 'True': True}

context_processors 范围,它将包含从上下文处理器全局注入到模板中的所有变量:

{'DEFAULT_MESSAGE_LEVELS': {'DEBUG': 10,
                            'ERROR': 40,
                            'INFO': 20,
                            'SUCCESS': 25,
                            'WARNING': 30},
 'csrf_token': <SimpleLazyObject: 'zJvE5t6k9KdxMfUmU4SOvRTOC2rh7Pvw'>,
 'debug': True,
 'messages': <django.contrib.messages.storage.fallback.FallbackStorage object at 0x10877b860>,
 'perms': <django.contrib.auth.context_processors.PermWrapper object at 0x10877de10>,
 'request': '<<request>>',
 'sql_queries': <function debug.<locals>.<lambda> at 0x108d3de18>,
 'user': <SimpleLazyObject: <User: phil>>}

Response范围,将所有变量传递给Response对象:

{'is_paginated': True,
 'object_list': '<<queryset of twitter.Tweet>>',
 'page_obj': <Page 1 of 330>,
 'paginator': <ditto.ditto.paginator.DiggPaginator object at 0x10877bac8>,
 'view': <ditto.twitter.views.TweetList object at 0x108782dd8>}

从最旧的(根)到最年轻的顺序列出,这意味着:后面提到的dicts中提到的所有变量都将覆盖上面提到的变量。

其他范围可以通过一些模板标签创建,例如 for loop、where、include... 这些范围在 django 调试工具栏中将不可见。

于 2015-09-23T18:14:43.257 回答