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.
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
@karthikr Tak, jestem tego pewien, właśnie przetestowany. Używam Django 1.3, jeśli to może być powód. – Hellnar
Mam taki sam problem z Django 1.6.1. Czy byłeś w stanie rozwiązać ten problem? – jaw