Я собираюсь поставить здесь свой текущий прогресс, хотя это еще не решено (но я нахожусь ближе, надеюсь). Я попытался следующим решить эту проблему:
использовал django-debug-toolbar: большой, но контекст дамп не читается для сложных шаблонов. Это просто огромный __repr__
свалка, не просматриваемый на всех, и не хватает информации (так как __repr__
s по необходимости укорочены)
используется {% debug %}
в шаблоне: еще хуже. Я не могу это прочитать. Это помогает, возможно, для небольших шаблонов, но если у вас есть форма с 5 полями и три других тега шаблона, удачи в чтении.
used a pdb
breakpoint для доступа к контексту. pdb
дает вам интерактивный интерфейс к контексту, но он не прост в использовании.
- используется точка останова
ipdb
. Это немного лучше, но это не possible to use magic functions (хотя они перечислены).
- использовано embedded ipython shell. Это игровой чейнджер. Вдруг вы можете легко просматривать контекст, связанные функции, код, автоматически красиво печатать все, использовать вкладку, ...
Мои templatetags
для этого был (файл 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>
(Вы должны pip install
ipython
и ipdb
)
Это пример сеанса:
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
оболочки, я был в состоянии найти, что максимальное значение в {{field.field.max_value}}
. Не знаю, зачем нужен двойной спецификатор поля, но он работает.
Спасибо, но это не работает для меня. Эти значения пустые в моем шаблоне, за исключением {{field.value}}, который имеет правильное значение. Как я могу получить доступ к контексту, чтобы увидеть, какие ценности/объекты доступны? Я хотел бы взглянуть на объект 'field' в контексте. У тебя есть трюк? У меня установлен django-debug-toolbar, но я не могу видеть объект 'field' в этом контексте. Можно ли заглянуть в оболочку iPython при рендеринге конкретного шаблона (своего рода контрольная точка шаблона)? – dangonfast
Поместите ['{% debug%}'] (https://docs.djangoproject.com/en/1.8/ref/templates/builtins/#debug) в верхней части вашего шаблона - это приведет к выгрузке контекста для вас осмотреть. – solarissmoke
Я сделал это, а также использовал панель инструментов django-debug и просмотрел реализацию хрустящей формы и использовал templatetag для запуска отладчика внутри шаблона (как pdb, так и ipdb) и просмотрел файл django.template.context .RequestContex, и ... но я просто не могу найти, как перечислять все доступные свойства объекта контекста поля. 'max_value' и' min_value', безусловно, недоступны, но 'значение' есть. Как узнать, какие объекты/свойства должны быть доступны для шаблона? – dangonfast