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.
Author: Josh Scholl, 2008-09-19

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).

 130
Author: Daryl Spitzer,
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'
 41
Author: nosklo,
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
 9
Author: John Millikin,
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.

 7
Author: olt,
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"
 3
Author: Pramod,
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.

 2
Author: muhuk,
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}
 2
Author: Gourneau,
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
 1
Author: Lou Franco,
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.

 1
Author: Rob Williams,
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

 1
Author: Robert Vanden Eynde,
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.

 0
Author: Clint Ecker,
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)
 0
Author: hupantingxue,
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ć.

 0
Author: William Keller,
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