Показать все атрибуты объекта jinja - программирование
Подтвердить что ты не робот

Показать все атрибуты объекта jinja

Есть ли способ отображения имени/содержимого/функций всех атрибутов данного объекта в шаблоне jinja. Это облегчило бы отладку шаблона, который не действует должным образом.

Я создаю веб-сайт с использованием рамки hyde, и это будет очень удобно, так как я все еще изучаю тонкости как 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 узнать о расширении, добавьте hyde_ext.custom_filters.CustomFilterPlugin в список "plugins" файла site.yaml.

Наконец, проверьте его в файле, вы можете добавить это на какую-то случайную страницу {{resource|debug_attr}} или следующее, чтобы получить даже подчеркивания-атрибуты {{resource|debug_attr(verbose=True)}}

Конечно, я должен добавить, что, похоже, в будущем это может стать намного проще в случае выпуска hyde 1.0. Тем более, что уже существует запрос на вытягивание, ожидающий реализации более простого решения. Это был отличный способ узнать немного больше о том, как использовать jinja и hyde, хотя!

4b9b3361

Ответ 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/#custom-filters