1

ich den folgenden Code haben:Jinja2 Filter für dynamische registrierte Vorlagen

from app.utils.logic.template_filters import get_date_europe 

env = Environment(
    loader=FileSystemLoader(template_dirs), 
    autoescape=True, 
    extensions=['jinja2.ext.i18n'], 
) 
env.install_null_translations() 
env.filters['get_date_europe'] = get_date_europe 

def render_from_text(text, **context): 
    t = jinja2.Template(text) 
    return t.render(**context) 

und ich möchte einen benutzerdefinierten Filter hinzufügen spezifischen Datumzeit Formatierung auszuführen. text ist eine gültige Vorlage, die als Zeichenfolge gespeichert wird. Das Problem ist, dass, wenn die Leitung {{ some_object.created_at|get_date_europe }} in Vorlage enthalten ist, jinja eine Ausnahme auslöst jinja2.exceptions.TemplateAssertionError: no filter named 'get_date_europe'

ich einen Debug-Haltepunkt in erste Linie von render_from_text gesetzt und nannte env.filters, erscheint Funktion dort 'get_date_europe': <function get_date_europe at 0x10fca02f0>, zu sein. Wie kann ich meinen Filter für jinja sichtbar machen?

P.S. Django 1.9 wird verwendet.

Antwort

1

Mein Problem war, dass ich versuchte, jinja2.Template(text) verwenden, die neue Instanz der Umgebung erstellt jedes Mal, anstatt aufgerufen wird. Diese Änderung ermöglichte es mir, meine Filter an die Umgebung zu übergeben, bevor ich die Vorlage tatsächlich lade. Es funktioniert folgendermaßen: jinja2.Template (Text) in __new__ Methode führt den folgenden Code: env = get_spontaneous_environment( block_start_string, block_end_string, variable_start_string, variable_end_string, comment_start_string, comment_end_string, line_statement_prefix, line_comment_prefix, trim_blocks, lstrip_blocks, newline_sequence, keep_trailing_newline, frozenset(extensions), optimized, undefined, finalize, autoescape, None, 0, False, None)

die neue env schafft. Es ist möglich, Erweiterungen zu übergeben, aber eine Erweiterung für Datumsformatierung ist viel zu kompliziert. So sieht mein Code jetzt so aus: env = Environment( loader=FileSystemLoader(template_dirs), autoescape=True, extensions=['jinja2.ext.i18n'], ) env.filters['format_datetime_europe'] = format_datetime_europe def render_from_text(text, **context): t = env.from_string(text) return t.render(**context)

Verwandte Themen