2013-07-15 6 views
5

Wydaje się, że „z” tag nie działa, jeśli jest zadeklarowana poza blokiem jak to:Django: ze znaczników poza blokami

{% extends 'base.html' %} 
{% with my_var=1 %} 

{% block test1 %} 
{{my_var}} 
{% endblock %} 

{% block test2 %} 
{{my_var}} 
{% endblock %} 

{% endwith %} 

Szablon powyżej po prostu wyświetla nic od my_var nie jest przekazywana do wnętrza te bloki. Jak mogę to przezwyciężyć?

+1

Nie sądzę, że "blok" jest powodem. Czy możesz po prostu sprawdzić, czy "{% testu bloku 1%} {% z my_var1 = 1%} {{my_var1}} {% endwith%} {% endblock%}" działa? – karthikr

+0

@karthikr Tak, jestem tego pewien, właśnie przetestowany. Używam Django 1.3, jeśli to może być powód. – Hellnar

+0

Mam taki sam problem z Django 1.6.1. Czy byłeś w stanie rozwiązać ten problem? – jaw

Odpowiedz

0

Przyszedłem do Django z używania Tornado z Jinja2 i byłem podupadły na punkcie niezdolności do ustawiania zmiennych, które (a) mogą być zdefiniowane w szablonie (nie widoku) i (b) byłyby dostępne w szablonie podstawowym z którego to pochodzi. Patrząc na mały czteroliniowy fragment kodu z django-libs, udało mi się stworzyć coś takiego, co działało dobrze. Oto przykład tytułu, który powinien pojawić się w różnych blokach.

settings.py - dodanie do szablonów (Django 1.10+)

TEMPLATES = { 
    ... 
    builtins = ['mysite...wherever...templatetags',] 
} 

mysite.whereever.templatetags.py

from django import template 
register = template.Library() 

@register.simple_tag(takes_context=True) 
def setvar(context, key, value): 
    context.dicts[0][key] = value 
    return '' 

base.html

{% block settings %} 
    {% comment %} 
      Put this at the TOP of the template before 
      any blocks that use variables. 
    {% endcomment %} 
{% endblock settings %} 

<html> 
<head><title>{{title}}</title></head> 
<body><h1>My Site: {{title}}</h1> 
{% block body %} 
{% endblock body %} 
</body></html> 

menu.html - szablon, który nie ustawia „tytuł” ​​w widokach:

{% extends "base.html" %} 
{% block settings %} 
    {{ block.super }} {% comment %}optional{% endcomment %} 
    {% setvar 'title' 'Menu' %} 
{% endblock %} 
{% block body %} 
    <ul><li>Fish</li><li>Steak</li></ul> 
{% endblock %} 

Teraz pojawi się tytuł w dwóch miejscach w HTML, nawet jeśli jest zdefiniowane w szablonie pochodzącego ale wydaje w górnym szablonie.

Powiązane problemy