2016-02-22 9 views
5

Ich habe eine Django-Anwendung, die das Django-Vorlagensystem verwendet, um ihre (nicht-HTML-) Ausgabe zu generieren, zusätzlich die Web-UI. Es gibt eine Reihe von Seiten, auf denen ein Benutzer eine Vorlage für einen Bericht erstellen kann, indem er {{}} Tags zur Variablensubstitution hinzufügt und eine zusätzliche Templatetag-Bibliothek, um die Dinge schön zu formatieren.Django-Vorlagen-Engine mit Fehlerüberprüfung?

Doch die aktuelle Art, wie ich das tue ist nur:

t = Template(component_template) 
self.output_content = t.render(component_context) 

, die die Standard-Web-Ausgabe Template-Engine verwendet. Dies hat string_if_invalid auf None gesetzt, und dire Warnungen im Handbuch über das Brechen der Admin-Seiten, wenn Sie es ändern.

Wenn also ein Benutzer entweder einen Tippfehler in einem Variablennamen in einem Tag erhält, wird dieser ruhig ignoriert und in die Ausgabe übernommen. Wenn sie ein beschädigtes Tag haben, tötet es tatsächlich die Web-App. Ich suche nach einer Möglichkeit, die Vorlage zur Bearbeitungszeit zu validieren, so dass der Benutzer gewarnt werden kann, dass Änderungen erforderlich sind.

Was denn ich bin mit dem Ziel ist so etwas wie Compiler Ausgabe:

unknown variable 'ffsdfd' on line 33 of template 
template syntax error on line 22 of template 

Mein erster Gedanke war, eine neue Vorlage Engine() und verwendet, die für diesen einen Zweck zu schaffen, so konnte ich ein unverwechselbares Standard beschmutzt string_if_invalid aber das sagt mir nichts über die fehlende/falsche Variable.

engine = Engine(string_if_invalid="!!MISSING_VARIABLE!!", dirs=settings.TEMPLATES[0]['DIRS'], 
       context_processors=settings.TEMPLATES[0]['OPTIONS']['context_processors'], 
       app_dirs=settings.TEMPLATES[0]['APP_DIRS']) 

t = Template(component_template, engine=engine) 

try: 
    self.output_content = t.render(component_context) 
except TemplateSyntaxError: 
    pass # do something useful here to collect error messages 

Die TemplateSyntaxError Ausnahme funktioniert, außer ich, keine Kontextinformationen erhalten wie, wo der Fehler tatsächlich ist, und natürlich bekomme ich nur den ersten Ausfall. Wenn man im django.template-Code nachschaut, sieht es so aus, als gäbe es intern eine Art extended exception, die die Zeilennummer und das Token hat, das sie zum Würgen gebracht hat, aber nicht von der render() -Methode.

So:

Wie kann ich nützliche Fehler für Fehler in Vorlagen Benutzer bearbeitet Handhabung? Sollte ich das alles anders machen?

Antwort

4

Hier ist, wie ich es selbst mit einer benutzerdefinierten Klasse und string_if_invalid lösen. Sie erhalten den Variablennamen, aber ich bin sicher, dass Sie ihn weiter optimieren können, um zusätzliche Kontextinformationen zu erhalten.

Globales settings.py Beispiel sollten Sie mit Ihrem Inline Beispiel leicht anpassbar sein:

class InvalidTemplateVariable(str): 
    def __mod__(self,other): 
     from django.template.base import TemplateSyntaxError 
     raise TemplateSyntaxError("Invalid variable : '%s'" % other) 

TEMPLATES = [ 
    { 
     'BACKEND': 'django.template.backends.django.DjangoTemplates', 
     'DIRS': [....], 
     'APP_DIRS': True, 
     'OPTIONS': { 
      'string_if_invalid': InvalidTemplateVariable("%s"), 
      'context_processors': [ 
       .... 
      ], 
     }, 
    }, 
] 

BTW, können Sie zusätzliche Informationen erhalten, wie/warum dies im folgenden Artikel arbeitet (was ich schrieb) http://www.webforefront.com/django/customizedjangotemplates.html#stringifinvaliderror

+0

Aha! Also der Teil, den ich vermisste war: "Wenn string_if_invalid ein '% s' enthält, wird die Formatmarke durch den Namen der ungültigen Variable ersetzt." (https://docs.djangoproject.com/de/1.9/ref/templates/api/#invalid-template-variables) (Aber die Konvertierung von str zu Ausnahme ist nett!) – AnotherHowie

Verwandte Themen