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!