2012-06-22 13 views
9

Powiedz, że używam return render_template('index.html', users=users). Czy możliwe jest pobranie nazwy pliku wewnątrz szablonu bez wyraźnego wysłania go wewnątrz widoku?Jak uzyskać nazwę bieżącego szablonu wewnątrz szablonu Jinja2?

+0

tylko zastanawiasz się: co próbujesz zrobić? (zainteresowany odpowiedzią) –

+0

I sekunda @JeffTratner. Co chcesz robić? – Apalala

+0

Chcę dodać klasę do treści w zależności od nazwy pliku. Na przykład, jeśli jest to szablon "user-details.html", chcę dodać odpowiednią klasę , aby poprawnie zarządzać przez javascript. –

Odpowiedz

5

Jeśli wszystko, czego potrzebujesz, to nazwa bazowa, możesz użyć {{ self }}, która zwróci ciąg repr zawierający nazwę podstawową szablonu, np. <TemplateReference 'view.html'>. Można analizować ten z filtrem, np {{ self | quoted }}

@app.template_filter('quoted') 
def quoted(s): 
    l = re.findall('\'([^\']*)\'', str(s)) 
    if l: 
     return l[0] 
    return None 

Jeśli potrzebujesz pełnej ścieżki, na przykład, „/full/path/to/view.html” ty chcieć podklasy Template.

+0

To nie działa. Gdy próbuję Twojego rozwiązania, ten błąd jest zgłaszany: TemplateAssertionError: brak filtru o nazwie "quoted" – renatov

+0

@renatov: Gdzie masz @ app.template_filter ('quoted')? Czy filtr jest poprawnie zarejestrowany w aplikacji Flask? – PartialOrder

5

Chociaż nieudokumentowane, {{ self._TemplateReference__context.name }} poda nazwę szablonu. Istnieje również wiele interesujących atrybutów, które można wykorzystać po self._TemplateReference__context.

Można na przykład dodać do swojej najwyższej szablonu bazowego:

 <meta name="template" content="{{ self._TemplateReference__context.name }}"> 

Więc patrząc na źródło strona pomoże Ci szybko znaleźć odpowiedni plik szablonu. Jeśli nie chcesz ujawniać tego typu informacji, uzależnij je od środowiska testowego.

Powiązane problemy