2012-06-08 15 views
5

Wystąpiło bardzo dziwne zachowanie systemu szablonów Django. Mam plik szablonu, mianowicie test.html, która zawiera się rekurencyjnie:Znacznik warunkowego uwzględnienia w Django

{% include "test.html" %} 

Oczywiście, taki szablon nie ma szans, aby być renderowane, ponieważ nie ma stan wykończeniowy. OK, spróbujmy następujące:

{% if test_false %}{% include "test.html" %}{% endif %}, 

gdzie test_false jest zmienna przekazywana do szablonu i równa False.

One spodziewa się, że po prostu nie będzie to nic, ale to robi:

RuntimeError at /test/ 
maximum recursion depth exceeded while calling a Python object 

ja nie rozumiem. Tag dołączania może przyjmować argumenty z bieżącego kontekstu, więc wątpię, by był on wykonywany przed jakąkolwiek inną częścią strony. Dlaczego więc ignoruje tag warunku?

Odpowiedz

6

Django ma optymalizację, która obejmuje szablony podane przez stałe podczas kompilacji.

Set nazwa szablonu do zmiennej i umieścić go w ten sposób:

{% include test_template %} 

Django nie będzie w stanie wykorzystać to optymalizacja i Twój kod powinien działać.

-1

Jak Thomasz mówi, Django może zrobić tylko to optymalizacja, jeśli ścieżka jest zdefiniowana jako stały ciąg znaków w tym szablonie - tak:

{% include "test.html" %} 

Ale ja raczej nie trzeba umieścić ścieżkę szablonu w kontekst z kodu Pythona.

Więc tutaj jest nieco bardziej samowystarczalne sposobem osiągnięcia tego samego rezultatu - owinąć to w with:

{% with "test.html" as path %} 
    {% include path %} 
{% endwith %} 
Powiązane problemy