Wyświetl wszystkie atrybuty obiektu jinja

Czy istnieje sposób wyświetlania nazwy / treści / funkcji wszystkich atrybutów danego obiektu w szablonie jinja. Ułatwiłoby to debugowanie szablonu, który nie działa zgodnie z oczekiwaniami.

Buduję stronę internetową za pomocąhyde frameworki i to byłoby całkiem przydatne, ponieważ wciąż uczę się zawiłości zarówno jinja, jak i hyde.

Pierwotnie myślałem, że to zadziałaattr filtr, ale wydaje się, że wymaga to wartości nazwy. Chciałbym nie podawać nazwy, aby uzyskać wszystkie dostępne atrybuty obiektu.

Niektóre wyszukiwania google pokazały, że składnia django wygląda następująco, ale nie znam django, więc może to dotyczyć tylko elementów bazy danych. Krótko mówiąc, chciałbym metodę, która działa tak jak dla każdego obiektu o nazwieobj

{% for field, value in obj.get_fields %}
    {{ field }} : {{ value }} </br>
{% endfor %}
ostateczne rozwiązanie:

@jayven miał rację, mogłem stworzyć własny filtr jinja2. Niestety, używając stabilnej wersji hyde (0.8.4), nie jest to trywialny akt posiadania filtra w pythonpath i ustawiania prostej wartości yaml wsite.yaml plik (istnieje żądanie ściągnięcia). Powiedziawszy to, udało mi się to rozgryźć! Oto moje ostatnie rozwiązanie, które jest bardzo pomocne w debugowaniu wszelkich nieznanych atrybutów.

Łatwo jest utworzyć rozszerzenia hyde specyficzne dla witryny, po prostu utwórz lokalny pakiet Pythona z następującym drzewem katalogów

hyde_ext
    __init__.py
    custom_filters.py

Teraz utwórz rozszerzenie:

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)

Aby poinformować hyde o rozszerzeniu dodajhyde_ext.custom_filters.CustomFilterPlugin do listy „wtyczek”site.yaml plik.

Na koniec przetestuj go na pliku, możesz dodać go do jakiejś losowej strony{{resource|debug_attr}} lub następujące, aby uzyskać nawet atrybuty podkreślenia{{resource|debug_attr(verbose=True)}}

Oczywiście powinienem dodać, że wydaje się, że w przyszłości stanie się o wiele łatwiejsze, gdy tylko zostanie wydany hyde 1.0. Zwłaszcza, że ​​istnieje już żądanie ściągnięcia czekające na wdrożenie prostszego rozwiązania. To był świetny sposób, aby dowiedzieć się trochę więcej o tym, jak używać jinja i hyde!

questionAnswers(1)

yourAnswerToTheQuestion