2012-06-30 16 views
7

Welche Bedingungen können wir für die Verzweigung in Jinja2 verwenden? Ich meine, können wir Python-ähnliche Anweisungen verwenden. Zum Beispiel möchte ich die Länge der Beschriftung überprüfen. Wenn größer als 60 Zeichen, möchte ich es auf 60 Zeichen beschränken und "..." setzen. Momentan mache ich so etwas, aber es funktioniert nicht. error.log meldet, dass die len-Funktion nicht definiert ist.wenn sonst Verzweigung in jinja2

template = Template(''' 
    <!DOCTYPE html> 
      <head> 
        <title>search results</title> 
        <link rel="stylesheet" href="static/results.css"> 
      </head> 
      <body> 
        {% for item in items %} 
          {% if len(item[0]) < 60 %} 
            <p><a href="{{ item[1] }}">{{item[0]}}</a></p> 
          {% else %} 
            <p><a href="{{ item[1] }}">{{item[0][40:]}}...</a></p> 
          {% endif %} 
        {% endfor %} 
      </body> 
    </html>''') 

## somewhere later in the code... 

template.render(items=links).encode('utf-8') 

Antwort

11

Sie sind ziemlich nah dran, Sie müssen es nur in Ihr Python-Skript verschieben. So können Sie ein Prädikat wie folgt definieren:

def short_caption(someitem): 
    return len(someitem) < 60 

Dann ist es auf die Umwelt registrieren, indem sie sie auf die ‚Tests‘ dict Zugabe):

your_environment.tests["short_caption"] = short_caption 

Und Sie es wie folgt verwenden können:

{% if item[0] is short_caption %} 
{# do something here #} 
{% endif %} 

Für mehr Informationen, hier ist die jinja docs auf custom tests

(Sie nur, dies zu tun haben einmal, und ich denke, dass es wichtig ist, ob Sie es tun, vor oder nach der Rendering-Vorlagen beginnen, sind die docs unklar)

Wenn Sie nicht eine Umgebung noch verwenden, können Sie es wie folgt instanziiert:

import jinja2 

environment = jinja2.Environment() # you can define characteristics here, like telling it to load templates, etc 
environment.tests["short_caption"] = short_caption 

Und dann die Vorlage durch die get_string laden() -Methode:

template = environment.from_string("""your template text here""") 
template.render(items=links).encode('utf-8') 

schließlich als eine Randnotiz, wenn Sie die Datei Loader verwenden, können Sie damit Datei Vererbung zu tun, Import-Makros, usw. Grundsätzlich Sie Speichere einfach deine Datei so wie du sie jetzt hast und erzähle jinja wo das Verzeichnis ist ist.

+0

Dank viel. Ich werde das machen. Ich entdeckte auch, dass ich es auch getan haben könnte, indem ich die Länge überprüft habe, während ich die db/index Dateien selbst abgefragt habe. – shashydhar

+0

froh zu helfen :) Sie können auf das kleine Kontrollkästchen klicken, um die Antwort zu akzeptieren, damit die Leute wissen, dass es gelöst ist und solche –

6

len ist nicht in jinja2 definiert, können Sie verwenden;

{% if item[0]|length < 60 %} 
+0

Nizza - das scheint die meisten Jinjaish (Jinjonic?) Weg, es zu tun. –

0

Jinja2 hat jetzt eine truncate Filter, der diese Prüfung für Sie tut

truncate(s, length=255, killwords=False, end='...', leeway=None)

Beispiel:

{{ "foo bar baz qux"|truncate(9) }} 
    -> "foo..." 

{{ "foo bar baz qux"|truncate(9, True) }} 
    -> "foo ba..." 

Referenz: http://jinja.pocoo.org/docs/2.9/templates/#truncate