2012-01-24 10 views
8

W szablonie django wywołanie {{ var }} zakończy się niepowodzeniem, jeśli var jest niezdefiniowane. To sprawia, że ​​szablony są trudne do debugowania. Czy istnieje ustawienie, które można zmienić, aby django rzucił wyjątek w tym przypadku?Uczyń szablony django surowymi

Jedyna wskazówka dotycząca rozwiązania, które znalazłem w Internecie to http://groups.google.com/group/google-appengine/browse_thread/thread/86a5b12ff868038d, co brzmi okropnie sroga.

+0

Metoda 1 w podanym łączu wygląda dobrze. Ponieważ niestandardowe tagi szablonów są uzasadnioną opcją rozszerzenia funkcjonalności szablonu. –

Odpowiedz

4

Django < = 1,9

Set TEMPLATE_STRING_IF_INVALID = 'DEBUG WARNING: undefined template variable [%s] not found' w settings.py.

Zobacz docs:
https://docs.djangoproject.com/en/1.9/ref/settings/#template-string-if-invalid

Django> = 1.10

ustawiona opcja string_if_invalid = 'DEBUG WARNING: undefined template variable [%s] not found' szablon w settings.py.

Zobacz docs: https://docs.djangoproject.com/en/2.0/topics/templates/#module-django.template.backends.django

czytaj również: http://docs.djangoproject.com/en/dev/ref/templates/api/#invalid-template-variables

+1

'TEMPLATE_STRING_IF_INVALID = '% s'' byłoby bardziej odpowiednie, ponieważ spowoduje wydrukowanie nazwy zmiennej, która nie jest zdefiniowana zamiast losowego tekstu. Jednak uważnie przeczytaj pole napomnienia na drugim łączu. Jest to naprawdę na jednorazowe instancje debugowania, * nie * coś, co należy pozostawić na cały czas w rozwoju. –

+2

Ustawienia TEMPLATE_STRING_IF_INVALID pomogą w znalezieniu nieprawidłowych zmiennych, gdy spróbujemy wydrukować je w szablonie, ale jeśli zmienna jest używana w instrukcji if lub jako kolekcja w pętli for, nie można znaleźć pomocy. .. Czy istnieje również sposób na złapanie tych przypadków? – Eldamir

+1

Czy istnieje sposób na podniesienie wyjątku, jeśli zmienna jest niezdefiniowana? – utapyngo

-1

To część projektu. Pozwala na dostarczanie wartości domyślnych i przełączanie w zależności od tego, czy zmienna istnieje w danym kontekście. Pozwala to również na bardzo elastyczne szablony i promuje wielokrotne używanie szablonów zamiast ścisłego podejścia "każdy widok musi mieć swój własny szablon".

Co więcej, szablony nie powinny być "debugowane". Pomysł polega na umieszczeniu jak największej logiki poza szablonem w widokach lub modelach. Jeśli chcesz dowiedzieć się, dlaczego zmienna, która powinna zostać przekazana do kontekstu, nie jest miejscem do debugowania, które jest w twoim widoku. Po prostu upuść import pdb;pdb.set_trace() gdzieś, zanim Twój widok powróci i zacznie się kręcić.

+1

To jest kod; w pewnym momencie będzie wymagało debugowania. – Marcin

+0

@Marcin: Mówię w sensie perspektywy Django. Jeśli polegasz na błędach debugowania szablonów w rozwoju dla rzeczy niezwiązanych z głupimi palcami w templatetag lub innych prostych błędach, prawdopodobnie masz zbyt wiele logiki w swoim szablonie. –

+0

Cóż, to kwestia opinii :) Ale to jest "Opinia Django", a jeśli jest to dla ciebie wystarczająco ważne, użyj innego silnika szablonów! Tak, z tego powodu między innymi. – AdamKG

2

Ten hack od djangosnippets spowoduje zgłoszenie wyjątku w przypadku napotkania niezdefiniowanej zmiennej w szablonie.

# settings.py 
class InvalidVarException(object): 
    def __mod__(self, missing): 
     try: 
      missing_str = unicode(missing) 
     except: 
      missing_str = 'Failed to create string representation' 
     raise Exception('Unknown template variable %r %s' % (missing, missing_str)) 
    def __contains__(self, search): 
     if search == '%s': 
      return True 
     return False 

TEMPLATE_DEBUG = True 
TEMPLATE_STRING_IF_INVALID = InvalidVarException() 
+0

To nie wydaje się wykrywać niezdefiniowanego foobara w '{% if foobar%}' lub '{% for foo in foobar%}' – azmeuk

+0

Po aktualizacji z 1.9.x> 1.10.1 otrzymuję: '?: (szablony. E002) 'string_if_invalid' w TEMPLATES OPTIONS musi być łańcuchem znaków, ale otrzymał: (InvalidVarException). "Więc ten hack już nie działa. – allcaps

+0

@callcaps co jeśli odziedziczysz go po 'basestring' lub' unicode'? – utapyngo

Powiązane problemy