2012-09-02 10 views
8

Chcę wskazać inne pliki HTML na podstawie zmiennej. Używam to w następującym formacie:Używanie include do dynamicznego wskazywania na HTML

{% include 'templates/case/{{cid}}/intro.html' %} 

to zgłasza błąd:

TemplateNotFound: templates/case/{{cid}}/intro.html 

Patrząc na to wiem Jinja2 nie rozwiąże zmienną w czasie wykonywania. Wartość cid = ABC (ABC nazwy folderu w ścieżce), więc spodziewałem całkowita droga będzie:

templates/case/ABC/intro.html 

Jeśli używam tego rozdzielić ścieżkę bezpośrednio w to działa.

Jak mogę rozwiązać ten problem?

Odpowiedz

2

Zawsze można obliczyć pełną ścieżkę w kodzie widoku i przekazać ją do szablonu, usuwając w tym miejscu cudzysłowy i nawiasy klamrowe wokół zmiennej.

Robiąc to, bądź ostrożny przed path traversal attacks.

+0

Thomas, dzięki za odpowiedź. Jeśli masz na myśli przekazanie kompletnej ścieżki w zmiennej: vid = 'templates/case/{{cid}}/intro.html', a następnie użyj jej w includeide .... {% include '{{vid}}' %}. Próbowałem to ... to daje ten sam błąd ... TemplateNotFound. – Utpal

+0

@Utpal Czy próbowałeś usunąć "{{}}" i po prostu użyć {% include vid%}? Mogę jednak odejść, od jakiegoś czasu nie używałem Jinji, ale spodziewałbym się, że będzie działało podobnie do django w tym względzie. Możesz sprawdzić to podobne pytanie: http://stackoverflow.com/questions/6101864/dynamic-use-of-templates-in-jinja2 –

+0

Dzięki za tonę Thomas. Usunięcie "{{}}" działa idealnie. Jednak sprawdziłbym "ataki na przemierzanie ścieżek", o których mnie ostrzegałeś. – Utpal

2

znaleźć odpowiedź w innym przepełnienie stosu pytanie here:

{% set path = 'templates/case/' + cid + '/intro.html' %}{% include path %} 
6

Oto jak przekazać kod bezpośrednio przez to

{% include "templates/case/"+cid+"/intro.html" %} 
+0

To zadziałało dla mnie z Nunjucks – colmjude

9

Przynajmniej w Jinja2 2.7.1 to działa:

{% include 'templates/case/%s/intro.html' % cid %} 
Powiązane problemy