Frage

ich einen benutzerdefinierten Tag in Jinja2 habe, dass ich nur das erste Mal für die Ausgabe zu wollen, dass sie aufgerufen wird. So sagen, ich habe die folgende Vorlage:

1. {% only_once %}
2. {% only_once %}
3. {% only_once %}

Ich mag die Ausgabe sein:

1. "I only get printed once!"
2.
3.

Ich bin der beste Weg, zu raten, dies zu tun, ist ein Flag im Zusammenhang mit der Vorlage einstellen zu verfolgen, ob ich schon etwas oder nicht gedruckt haben. Hier ist ein Codebeispiel, aber das ist nicht wahr?

class OnlyOnceExtension(Extension):
    tags = set(['only_once'])

    @contextfunction
    def parse(self, context, parser):
        if hasattr(context, 'my_flag') and context.my_flag:
            return Output("")
        else:
            return Output("I only get printed once!")

Ist das richtig? Ich lese ein paar Sachen über den Kontext unveränderlich ist, so wird dies nicht funktionieren? (Siehe http://jinja.pocoo.org/2/documentation/api und Suche nach unveränderlichen)

War es hilfreich?

Lösung

Mein Vorschlag ist, dies in Python-Code zu implementieren:

class OnlyOnce(object):
    def __init__(self, data):
        self.data = data
        self.printed = False

    def __str__(self):
        if self.printed is False:
            self.printed = True
            return self.data
        return ''

Eine OnlyOnce Instanz in Ihrem Python-Code und gibt sie an die Vorlage, und dann jedes Mal, wenn Sie wollen, es zu benutzen, nur {{ only_once }} verwenden.

Eine Sache, die ich Mitteilung über eine Menge Leute Jinja ist, dass sie die Dinge in eine Django-ish Art und Weise tun wollen, das heißt, das Schreiben Erweiterungen. Aber Jinja der Ausdrücke / Import / was auch immer ist mächtig genug, dass Sie müssen keine Erweiterungen für alles verwendet werden.

Und ja, die context.my_flag Sache verwendet, ist eine schlechte Idee. Nur wird die Vorlage, um den Kontext zu ändern. je.

Andere Tipps

Wenn Sie es rein mit Jinja tun wollen überprüfen Sie können einfach die loop.index Variable in dieser Art und Weise,

{% for bar in bars %}
    {% if loop.index == 1 %}
        Print me once
    {% endif %}
    Print me every time
{% endfor %}

würde ich einen boolean und ein Makro definieren und gehen von dort aus. Statt die Variable zu drucken, können Sie das Ergebnis der Makro drucken, die verwendet eine if-Anweisung und die boolean zu entscheiden, ob es gedruckt werden soll. Also, Sie die folgende erhalten:

{{ set was_printed = false }}
{% macro print_once(to_print) %}
    {% if was_printed is sameas false %}
        {{ to_print }}
        {% set was_printed = true %}
    {% endif %}
{% endmacro %}
1. {% print_once(only_once) %}
2. {% print_once(only_once) %}
3. {% print_once(only_once) %}
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top