Отобразить все атрибуты объекта jinja
Есть ли способ отобразить имя / содержание / функции всех атрибутов данного объекта в шаблоне jinja. Это облегчило бы отладку шаблона, который не работает должным образом.
Я создаю сайт, используя hyde
рамки, и это может пригодиться, так как я все еще изучаю тонкости как дзиндзя, так и хайда.
Первоначально я думал, что это будет работать, чтобы использовать attr
фильтр, но это, кажется, требует значения имени. Я хотел бы не указывать имя, чтобы получить все доступные атрибуты для объекта.
Некоторые поиски в Google показали, что синтаксис django выглядит следующим образом, но я не знаком с django, так что это может относиться только к элементам базы данных. Короче говоря, я хотел бы метод, который работает примерно так для любого объекта с именем obj
{% for field, value in obj.get_fields %}
{{ field }} : {{ value }} </br>
{% endfor %}
окончательное решение:
@jayven был прав, я мог бы создать свой собственный фильтр jinja2. К сожалению, используя стабильную версию hyde (0.8.4), это не тривиальный акт: наличие фильтра в pythonpath и установка простого значения yaml в site.yaml
файл (для этого есть pull-запрос). При этом, я смог понять это! Итак, вот мое окончательное решение, которое в конечном итоге оказывается очень полезным для отладки любых неизвестных атрибутов.
Достаточно просто создать специфичные для сайта расширения hyde, просто создайте локальный пакет python со следующим деревом каталогов
hyde_ext
__init__.py
custom_filters.py
Теперь создайте расширение:
from hyde.plugin import Plugin
from jinja2 import environmentfilter, Environment
debug_attr_fmt = '''name: %s
type: %r
value: %r'''
@environmentfilter
def debug_attr(env, value, verbose=False):
'''
A jinja2 filter that creates a <pre> block
that lists all the attributes of a given object
inlcuding the value of those attributes and type.
This filter takes an optional variable "verbose",
which prints underscore attributes if set to True.
Verbose printing is off by default.
'''
begin = "<pre class='debug'>\n"
end = "\n</pre>"
result = ["{% filter escape %}"]
for attr_name in dir(value):
if not verbose and attr_name[0] == "_":
continue
a = getattr(value, attr_name)
result.append(debug_attr_fmt % (attr_name, type(a), a))
result.append("{% endfilter %} ")
tmpl = Environment().from_string("\n\n".join(result))
return begin + tmpl.render() + end
#return "\n\n".join(result)
# list of custom-filters for jinja2
filters = {
'debug_attr' : debug_attr
}
class CustomFilterPlugin(Plugin):
'''
The curstom-filter plugin allows any
filters added to the "filters" dictionary
to be added to hyde
'''
def __init__(self, site):
super(CustomFilterPlugin, self).__init__(site)
def template_loaded(self,template):
super(CustomFilterPlugin, self).template_loaded(template)
self.template.env.filters.update(filters)
Чтобы Хайд знал о расширении добавить hyde_ext.custom_filters.CustomFilterPlugin
в список "плагинов" site.yaml
файл.
Наконец, протестируйте его в файле, вы можете добавить это на какую-то случайную страницу {{resource|debug_attr}}
или следующее, чтобы получить даже атрибуты подчеркивания {{resource|debug_attr(verbose=True)}}
Конечно, я должен добавить, что кажется, что это может стать намного легче в будущем, когда выйдет Hyde 1.0. Тем более, что уже есть запрос на получение, ожидающий реализации более простого решения. Это был отличный способ узнать немного больше о том, как использовать дзиндзя и хайда!
1 ответ
Я думаю, что вы можете реализовать фильтр самостоятельно, например:
from jinja2 import *
def show_all_attrs(value):
res = []
for k in dir(value):
res.append('%r %r\n' % (k, getattr(value, k)))
return '\n'.join(res)
env = Environment()
env.filters['show_all_attrs'] = show_all_attrs
# using the filter
tmpl = env.from_string('''{{v|show_all_attrs}}''')
class Myobj(object):
a = 1
b = 2
print tmpl.render(v=Myobj())
Также см. Документ для деталей: http://jinja.pocoo.org/docs/api/