2016-02-22 15 views
5

Ho un'applicazione Django che usa il sistema di template Django per generare il suo output (non HTML), oltre l'interfaccia utente web. Esiste un set di pagine in cui un utente può creare un modello per un report, aggiungere {{}} tag per la sostituzione delle variabili e una libreria di templatetag aggiuntiva per formattare le cose in modo corretto.motore di template django con controllo degli errori?

Tuttavia, il modo corrente che sto facendo questo è solo:

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

che utilizza il motore di template web-output predefinito. Questo ha string_if_invalid impostato su None e terribili avvisi nel manuale sulla rottura delle pagine di amministrazione se si cambia.

Quindi, se un utente riceve un errore di battitura in un nome di variabile in un tag, viene tranquillamente ignorato e lo inserisce nell'output. Se hanno un tag storpiato, in realtà uccide l'app Web. Sto cercando un modo per convalidare il modello in fase di modifica, in modo che l'utente possa essere avvisato della necessità di apportare modifiche.

Quello che sto puntando è qualcosa di simile l'output del compilatore:

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

Il mio primo pensiero è stato quello di creare un nuovo modello del motore() e l'uso che per questo scopo, così ho potuto individuare un default distintivo string_if_invalid ma questo non mi dice nulla su la variabile mancante/errata.

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 

L'eccezione TemplateSyntaxError funziona, tranne che non ho ricevuto alcuna informazione contesto, come dove l'errore è in realtà, e, naturalmente, ho solo il primo fallimento. Osservando il codice django.template, sembra che internamente ci sia una sorta di eccezione estesa che ha il numero di riga e il token che lo ha indotto a soffocare, ma non sfugge al metodo render().

Quindi:

Come posso fornire utili movimentazione per errori nei modelli di utente-edited errore? Dovrei fare questo in un modo completamente diverso?

risposta

4

Ecco come lo risolvo io stesso utilizzando una classe personalizzata e string_if_invalid. Ti dà il nome della variabile, ma sono sicuro che puoi modificarlo ulteriormente per ottenere ulteriori informazioni di contesto.

esempio settings.py globale, dovrebbe essere facilmente adattabile a tuo esempio inline:

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, è possibile ottenere informazioni aggiuntive su come/perché questo funziona al seguente articolo (che ho scritto) http://www.webforefront.com/django/customizedjangotemplates.html#stringifinvaliderror

+0

Aha! Quindi in realtà la parte che mancavo era: "Se string_if_invalid contiene un '% s', il marcatore di formato verrà sostituito con il nome della variabile non valida." (https://docs.djangoproject.com/en/1.9/ref/templates/api/#invalid-template-variables) (Ma la conversione da str a exception è bella!) – AnotherHowie

Problemi correlati