Alle Jinja-Objektattribute anzeigen

Gibt es eine Möglichkeit, den Namen / Inhalt / die Funktionen aller Attribute eines bestimmten Objekts in einer Jinja-Vorlage anzuzeigen? Dies würde das Debuggen einer Vorlage erleichtern, die nicht wie erwartet funktioniert.

Ich baue eine Website mit demhyde Framework und dies wäre sehr praktisch, da ich immer noch die Feinheiten von Jinja und Hyde lerne.

Ursprünglich hatte ich gedacht, es würde funktionieren, das zu benutzenattr Filter, aber dies scheint einen Namen Wert zu erfordern. Ich möchte den Namen nicht angeben müssen, um alle verfügbaren Attribute für das Objekt zu erhalten.

Einige Google-Suchanfragen haben gezeigt, dass die Django-Syntax wie folgt aussieht, aber ich bin nicht mit Django vertraut, sodass dies möglicherweise nur für Datenbankelemente gilt. Um es kurz zu machen, ich hätte gerne eine Methode, die für jedes benannte Objekt so funktioniertobj

{% for field, value in obj.get_fields %}
    {{ field }} : {{ value }} </br>
{% endfor %}
endgültige Lösung:

@jayven hatte recht, ich konnte meinen eigenen jinja2 filter erstellen. Leider ist es bei Verwendung der stabilen Version von hyde (0.8.4) keine triviale Sache, einen Filter im Pythonpfad zu haben und einen einfachen yaml-Wert im Pythonpfad zu setzensite.yaml Datei (Es gibt eine Pull-Anfrage dafür). Davon abgesehen konnte ich es herausfinden! Das Folgende ist meine endgültige Lösung, die letztendlich sehr hilfreich ist, um unbekannte Attribute zu debuggen.

Es ist einfach genug, ortsspezifische Hyde-Erweiterungen zu erstellen. Erstellen Sie einfach ein lokales Python-Paket mit dem folgenden Verzeichnisbaum

hyde_ext
    __init__.py
    custom_filters.py

Erstellen Sie nun die Erweiterung:

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)

Um hyde über die Erweiterung zu informieren, fügen Sie hinzuhyde_ext.custom_filters.CustomFilterPlugin zur "Plugins" Liste dersite.yaml Datei.

Zum Schluss testen Sie es an einer Datei, die Sie einer zufälligen Seite hinzufügen können{{resource|debug_attr}} oder das Folgende, um sogar die Unterstrich-Attribute zu erhalten{{resource|debug_attr(verbose=True)}}

Natürlich sollte ich hinzufügen, dass es in Zukunft viel einfacher werden könnte, wenn Hyde 1.0 veröffentlicht wird. Zumal bereits eine Pull-Anfrage auf die Implementierung einer einfacheren Lösung wartet. Dies war eine großartige Möglichkeit, etwas mehr über die Verwendung von Jinja und Hyde zu lernen!

Antworten auf die Frage(1)

Ihre Antwort auf die Frage