Jak używać szablonów Django bez reszty Django?
Chcę użyć silnika szablonów Django w moim kodzie (Python), ale nie buduję strony internetowej opartej na Django. Jak go używać bez posiadania settings.py pliku (i innych) i konieczności ustawienia zmiennej środowiskowej DJANGO_SETTINGS_MODULE?
Jeśli uruchomię następujący kod:
>>> import django.template
>>> from django.template import Template, Context
>>> t = Template('My name is {{ my_name }}.')
Dostaję:
ImportError: Settings cannot be imported, because environment variable DJANGO_SETTINGS_MODULE is undefined.
13 answers
Rozwiązanie jest proste. Jest właściwie dobrze udokumentowane , ale nie jest zbyt łatwe do znalezienia. (Musiałem poszperać - nie wyszło, gdy próbowałem kilku różnych wyszukiwań w Google.)
Działa następujący kod:
>>> from django.template import Template, Context
>>> from django.conf import settings
>>> settings.configure()
>>> t = Template('My name is {{ my_name }}.')
>>> c = Context({'my_name': 'Daryl Spitzer'})
>>> t.render(c)
u'My name is Daryl Spitzer.'
Zobacz dokumentację Django (linkowaną powyżej) po opis niektórych ustawień, które chcesz zdefiniować (jako argumenty słów kluczowych do skonfigurowania).
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2013-07-25 00:31:57
Jinja2 składnia jest prawie taka sama jak Django z bardzo niewielkimi różnicami, a Ty otrzymujesz znacznie mocniejszy silnik szablonów, który również kompiluje Twój szablon do kodu bajtowego (szybko!).
Używam go do tworzenia szablonów, także w samym Django i jest bardzo dobry. Możesz również łatwo pisać rozszerzenia, jeśli brakuje jakiejś żądanej funkcji.
Oto demonstracja generowania kodu:
>>> import jinja2
>>> print jinja2.Environment().compile('{% for row in data %}{{ row.name | upper }}{% endfor %}', raw=True)
from __future__ import division
from jinja2.runtime import LoopContext, Context, TemplateReference, Macro, Markup, TemplateRuntimeError, missing, concat, escape, markup_join, unicode_join
name = None
def root(context, environment=environment):
l_data = context.resolve('data')
t_1 = environment.filters['upper']
if 0: yield None
for l_row in l_data:
if 0: yield None
yield unicode(t_1(environment.getattr(l_row, 'name')))
blocks = {}
debug_info = '1=9'
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2008-09-19 00:14:03
Jakiś szczególny powód, dla którego chcesz używać szablonów Django? ZarównoJinja jak i Genshi są, moim zdaniem, lepsi.
Jeśli naprawdę chcesz, zobacz dokumentację Django na settings.py
. Szczególnie sekcja " Korzystanie z ustawień bez Ustawienia DJANGO_SETTINGS_MODULE
". Użyj czegoś takiego:
from django.conf import settings
settings.configure (FOO='bar') # Your settings go here
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2008-09-18 23:56:36
Polecam również jinja2. Istnieje ładny Artykuł na temat django
vs. jinja2
, który daje pewne szczegółowe informacje na temat tego, dlaczego powinieneś preferować później.
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2014-07-29 10:41:29
Zgodnie z dokumentacją Jinja, Obsługa Pythona 3 jest wciąż eksperymentalna . Więc jeśli korzystasz z Pythona 3 i wydajność nie jest problemem, możesz użyć wbudowanego w django silnika szablonów.
Django 1.8 wprowadziło wsparcie dla wielu silników szablonów, co wymaga zmiany sposobu inicjowania szablonów. Musisz jawnie skonfigurować settings.DEBUG
, który jest używany przez domyślny silnik szablonów dostarczany przez django. Oto kod do korzystania z szablonów bez użycia reszta django.
from django.template import Template, Context
from django.template.engine import Engine
from django.conf import settings
settings.configure(DEBUG=False)
template_string = "Hello {{ name }}"
template = Template(template_string, engine=Engine())
context = Context({"name": "world"})
output = template.render(context) #"hello world"
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2015-12-28 14:00:18
Jinja też. Jest to zdecydowanie mocniejsze niż Django Templating Engine i jest to stand alone .
Jeśli była to zewnętrzna wtyczka do istniejącej aplikacji Django, możesz utworzyć własne polecenie i użyć silnika szablonów w swoim środowisku projektów. Tak;
manage.py generatereports --format=html
Ale myślę, że nie warto używać silnika szablonów Django zamiast Jinja.
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2008-12-05 22:15:35
Dzięki za pomoc. Oto jeszcze jeden dodatek. Przypadek, w którym musisz użyć niestandardowych znaczników szablonów.
Załóżmy, że masz ten ważny znacznik szablonu w module read.py
from django import template
register = template.Library()
@register.filter(name='bracewrap')
def bracewrap(value):
return "{" + value + "}"
Jest to plik szablonu html " temp.html":
{{var|bracewrap}}
Na koniec, oto skrypt Pythona, który połączy wszystkie razem
import django
from django.conf import settings
from django.template import Template, Context
import os
#load your tags
from django.template.loader import get_template
django.template.base.add_to_builtins("read")
# You need to configure Django a bit
settings.configure(
TEMPLATE_DIRS=(os.path.dirname(os.path.realpath(__file__)), ),
)
#or it could be in python
#t = Template('My name is {{ my_name }}.')
c = Context({'var': 'stackoverflow.com rox'})
template = get_template("temp.html")
# Prepare context ....
print template.render(c)
Wyjście będzie
{stackoverflow.com rox}
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2013-12-09 20:37:34
Found this:
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2008-09-18 23:58:12
Nie używaj zamiast tego StringTemplate --nie ma powodu, aby brać pod uwagę inny silnik szablonów, gdy już o nim wiesz.
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2011-04-04 21:04:55
Dodatek do tego, co napisali inni, jeśli chcesz użyć szablonu Django na Django > 1.7, musisz podać swoje ustawienia.configure(...) wywołaj zmienną TEMPLATES i wywołaj django.setup() jak to:
from django.conf import settings
settings.configure(TEMPLATES=[
{
'BACKEND': 'django.template.backends.django.DjangoTemplates',
'DIRS': ['.'], # if you want the templates from a file
'APP_DIRS': False, # we have no apps
},
])
import django
django.setup()
Następnie możesz załadować szablon jak zwykle, z ciągu znaków:
from django import template
t = template.Template('My name is {{ name }}.')
c = template.Context({'name': 'Rob'})
t.render(c)
I jeśli napisałeś zmienną DIRS wkonfiguracja, z dysku:
from django.template.loader import get_template
t = get_template('a.html')
t.render({'name': 5})
Błąd Django: nie ma backendu DjangoTemplates konfiguracja
Http://django.readthedocs.io/en/latest/releases/1.7.html#standalone-scripts
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-12-03 19:02:44
Powtórzę powyższe stwierdzenia. Jinja 2 to całkiem dobry superset szablonów Django do ogólnego użytku. Myślę, że pracują nad tym, aby Szablony Django były trochę mniej powiązane z settings.py ale Jinja dobrze ci zrobi.
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2008-09-19 00:18:31
Podczas uruchamiania powłoki manage.py
:
>>> from django import template
>>> t = template.Template('My name is {{ me }}.')
>>> c = template.Context({'me': 'ShuJi'})
>>> t.render(c)
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2012-10-10 22:42:10
Google AppEngine
używa silnika szablonów Django, widziałeś jak to robią? Mógłbyś to wykorzystać.
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2013-05-02 08:14:16