Django 调试工具栏的 'Toggle context' 区域中有哪些不同的指令?

What are the different dicts in Django Debug Toolbar's 'Toggle context' areas?

使用 Django Debug Toolbar 我可以转到 'Templates' 面板并单击 'Toggle context' 链接随时查看上下文。

其中每一个都显示不止一个字典,例如:

{'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>}

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

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

负责呈现模板的每个 'layers' 都将添加自己的范围。默认情况下有 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 调试工具栏中是不可见的。