2009-11-02 23 views
21

Potrzebuję utworzyć identyfikator otoczony nawiasami klamrowymi (na przykład "{1234}"). W języku szablonów django, klamry są również używane do rozpoczynania zastępowania zmiennych, więc mam problem z uzyskaniem tego, co chcę. PróbowałemJak umieścić nawiasy klamrowe w szablonach django?

{{{ id }}} 
{{ '{'id'}' }} 
{{ '{'+id+'}' }} 
{ {{ id }} } 

Żadna z tych metod pracy, z wyjątkiem ostatniego, który niestety produkuje „{1234}”, a nie to, co chcę. Obecnie mam dwa rozwiązania: albo przekazuję zmienną id zawierającą już {} (brzydki) lub piszę filtr niestandardowy, a następnie napiszę {{id | add_braces}} (wolę to).

Zanim przejdziemy w tę stronę, wolę zapytać, czy istnieje lepsze rozwiązanie.

Używanie wartości przekształconych nie działa. Nawet jeśli dodaję {% autoescape off%}% 7B {% endautoescape%} nie dostaję {, co jest dziwne, ale to kolejny problem.

Dzięki

Edit: Napisałem krótki filtr. Wklejasz go tutaj, aby ktoś inny mógł go użyć jako szablonu do napisania bardziej złożonego. Zostać wprowadzone do pakietu python application_path/templatetags/formatting.py

from django import template 
from django.template.defaultfilters import stringfilter 

register = template.Library() 

@register.filter 
@stringfilter 
def add_braces(value): 
    return "{"+value+"}" 

Odpowiedz

28

Myślę, że odpowiedź można znaleźć tutaj:

http://docs.djangoproject.com/en/dev/ref/templates/builtins/#templatetag

W skrócie, chcesz używać {% templatetag openbrace %} i {% templatetag closebrace %}.

Edit: Django obecnie obejmuje również tę funkcję po wyjęciu z pudełka:

{% verbatim %} {{ blah blah }} {% endverbatim %} 
+0

Dzięki! w każdym razie napisałem filtr. Dodanie go, jeśli ktoś chce użyć go jako przykład małego filtru ... –

10

{% templatetag openbrace %} się bardzo gadatliwy na przykład Szablony javascript

Użyłem tag verbatim z this gist z pewnym sukcesem dokładnie tego celu, który pozwala zrobić coś podobnego

{{ request.user }} 
{% verbatim %} 
    brackets inside here are left alone, which is handy for e.g. jquery templates 
    {{ this will be left }} 
    {% so will this %} 
{% endverbatim }} 

{% more regular tags (to be replaced by the django template engine %} 
+0

Znacznik szablonu dosłownego jest teraz częścią django (1.5): https://docs.djangoproject.com/en/1.5/ref/templates/builtins/# verbatim – stephendwolff

+0

Przyjęta odpowiedź na to pytanie powinna prawdopodobnie zostać zmieniona - dosłownie naprawdę jest to właściwy sposób na zrobienie tego teraz. – shacker

0

Zalecenie z języka szablonów Jinja współpracuje z silnikiem szablonów Django, a także :

http://jinja.pocoo.org/docs/dev/templates/#escaping

rozwiązanie to:

{{ '{' }}{{ id }}{{ '}' }} 

Oczywiście pozostałe dwie odpowiedzi działają, ale to jedna z nich jest mniej obszerna i bardziej czytelna, moim zdaniem.

+0

Dla małych wartości dosłownych, jest to dobre rozwiązanie. W przypadku dużych bloków użyłbym znacznika bloku '{% verbatim%}'. – Rebs

Powiązane problemy