我打算在这里记录下我当前的进展,虽然这还没有解决(但我希望我正在接近)。我尝试了以下方法来解决这个问题:
使用了django-debug-toolbar:很好,但是对于复杂模板的上下文转储不可读。它只是一个巨大的__repr__
转储,完全无法浏览,并且缺少信息(因为__repr__
必须被缩短)
在模板中使用{% debug %}
:更糟糕。我无法阅读它。它可能有助于小型模板,但如果您有一个包含5个字段和三个其他模板标记的表单,那么祝你好运。
使用pdb
断点访问上下文。 pdb
为您提供与上下文交互的界面,但使用起来并不容易。
- 使用了
ipdb
断点。这稍微好一些,但不能使用魔术函数(即使已列出)。
- 使用了嵌入式IPython shell。这是一个改变游戏规则的技巧。突然间,您可以轻松浏览上下文、相关函数、代码,自动漂亮地打印所有内容,使用制表符完成等等。
我的模板标签是通过文件
templatetags/debug.py
实现的。
from django.template import Library, Node
register = Library()
class PdbNode(Node):
def render(self, context):
import pdb as pdb_module
pdb_module.set_trace()
return ''
class IPdbNode(Node):
def render(self, context):
import ipdb as ipdb_module
ipdb_module.set_trace()
return ''
class EmbedIPythonNode(Node):
def render(self, context):
from IPython import embed
embed()
return ''
@register.tag
def pdb(parser, token):
return PdbNode()
@register.tag
def ipdb(parser, token):
return IPdbNode()
@register.tag
def ipython(parser, token):
return EmbedIPythonNode()
你可以在模板中像这样使用它:
{% load debug %}
{% ipython %}
{% pdb %}
{% ipdb %}
<row>
<div class="col-lg-6""></div>
<div class="col-lg-6"">
<div class="slider {{field.extra_class}}" data-prefix="{{field.prefix}}" data-postfix="{{field.postfix}}" data-min="{{widget.min}}" data-max="{{widget.max}}" data-value="{{field.value}}"></div>
</div>
</row>
您需要安装
ipython
和
ipdb
,可以使用
pip install
命令进行安装。
以下是一个示例会话:
In [15]: dir(context.dicts[5]['field'])
Out[15]:
['__class__',
'__delattr__',
'__dict__',
'__doc__',
'__format__',
'__getattribute__',
'__getitem__',
'__hash__',
'__html__',
'__init__',
'__iter__',
'__len__',
'__module__',
'__new__',
'__reduce__',
'__reduce_ex__',
'__repr__',
'__setattr__',
'__sizeof__',
'__str__',
'__subclasshook__',
'__unicode__',
'__weakref__',
'_initial_value',
'as_hidden',
'as_text',
'as_textarea',
'as_widget',
'auto_id',
'css_classes',
'data',
'errors',
'field',
'form',
'help_text',
'html_initial_id',
'html_initial_name',
'html_name',
'id_for_label',
'is_hidden',
'label',
'label_tag',
'name',
'value']
由于
ipython
shell 的帮助,我能够找到最大值在
{{field.field.max_value}}
。不知道为什么需要双重字段说明符,但它可以工作。
field
对象。你有什么技巧吗?我已经安装了django-debug-toolbar,但我无法在那里看到上下文中的field
对象。在渲染特定模板时是否可以进入iPython shell(一种模板断点)? - blueFast{% debug %}
- 这将为您提供要检查的上下文。 - solarissmokemax_value
和min_value
绝对不可用,但value
是可用的。你怎么知道哪些对象/属性应该在模板中可用? - blueFastfield
对象,那么检查type(field)
确保它是你所期望的IntegerField
,并使用dir(field)
查看它公开了哪些属性和方法。这会给你什么信息? - solarissmoke{{field.field.max_value}}
中(也就是一个 double 字段说明符)。而该值在{{field.value}}
中,正如你正确地指出的那样。就因为这个,我给你点赞,但请纠正其他说明符以避免混淆。 - blueFast