Как использовать шаблоны Django без остальной части Django? - PullRequest
99 голосов
/ 19 сентября 2008

Я хочу использовать шаблонизатор Django в своем коде (Python), но я не создаю веб-сайт на основе Django Как использовать его, не имея файла settings.py (и других) и не устанавливая переменную окружения DJANGO_SETTINGS_MODULE?

Если я запускаю следующий код:

>>> import django.template
>>> from django.template import Template, Context
>>> t = Template('My name is {{ my_name }}.')

Я получаю:

ImportError: Settings cannot be imported, because environment variable DJANGO_SETTINGS_MODULE is undefined.

Ответы [ 13 ]

131 голосов
/ 19 сентября 2008

Решение простое. Это на самом деле хорошо документировано , но его не так просто найти. (Мне пришлось покопаться - он не появился, когда я попробовал несколько разных поисков в Google.)

Работает следующий код:

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

См. Документацию Django (ссылка выше) для описания некоторых настроек, которые вы можете захотеть определить (в качестве аргументов для настройки).

43 голосов
/ 19 сентября 2008

Jinja2 синтаксис почти такой же, как у Django, с очень небольшими отличиями, и вы получаете гораздо более мощный механизм шаблонов, который также компилирует ваш шаблон в байт-код (FAST!) .

Я использую его для шаблонов, в том числе в самом Django, и это очень хорошо. Вы также можете легко написать расширения, если какая-то нужная вам функция отсутствует.

Вот несколько примеров генерации кода:

>>> 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'
9 голосов
/ 19 сентября 2008

По какой конкретной причине вы хотите использовать шаблоны Django? И Jinja и Genshi , на мой взгляд, превосходят.


Если вы действительно хотите, то смотрите документацию Django на settings.py. Особенно в разделе «Использование настроек без настроек DJANGO_SETTINGS_MODULE». Используйте что-то вроде этого:

from django.conf import settings
settings.configure (FOO='bar') # Your settings go here
7 голосов
/ 21 сентября 2008

Я бы также порекомендовал jinja2. * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * jinja2.

3 голосов
/ 28 декабря 2015

Согласно документации Jinja, Поддержка Python 3 все еще экспериментальная . Так что, если вы работаете на Python 3 и производительность не является проблемой, вы можете использовать встроенный в django шаблонизатор.

В Django 1.8 появилась поддержка нескольких шаблонизаторов , что требует изменения способа инициализации шаблонов. Вы должны явно настроить settings.DEBUG, который используется механизмом шаблонов по умолчанию, предоставленным django. Вот код для использования шаблонов без использования остальной части 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"
2 голосов
/ 10 декабря 2013

Спасибо за помощь, ребята. Вот еще одно дополнение. Случай, когда вам нужно использовать пользовательские теги шаблонов.

Допустим, у вас есть этот важный тег шаблона в модуле read.py

from django import template

register = template.Library()

@register.filter(name='bracewrap')
def bracewrap(value):
    return "{" + value + "}"

Это HTML-файл шаблона "temp.html":

{{var|bracewrap}}

Наконец, вот скрипт Python, который связывает все вместе

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)

Вывод будет

{stackoverflow.com rox}
2 голосов
/ 06 декабря 2008

Я бы сказал Джинджа . Это определенно более мощный , чем Django Templating Engine, и он автономен .

Если бы это был внешний плагин для существующего приложения Django, вы могли бы создать пользовательскую команду и использовать механизм шаблонов в среде ваших проектов. Как это;

manage.py generatereports --format=html

Но я не думаю, что стоит использовать шаблонизатор Django вместо Jinja.

1 голос
/ 24 ноября 2017

В дополнение к тому, что написали другие, если вы хотите использовать Django Template для Django> 1.7, вы должны дать в вашем settings.configure (...) вызов переменной TEMPLATES и вызвать django.setup () следующим образом:

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

Затем вы можете загрузить свой шаблон, как обычно, из строки:

from django import template   
t = template.Template('My name is {{ name }}.')   
c = template.Context({'name': 'Rob'})   
t.render(c)

А если вы записали переменную DIRS в .configure с диска:

from django.template.loader import get_template
t = get_template('a.html')
t.render({'name': 5})

Ошибка Django: сервер DjangoTemplates не настроен

http://django.readthedocs.io/en/latest/releases/1.7.html#standalone-scripts

1 голос
/ 20 ноября 2008

Не. Вместо этого используйте StringTemplate - нет никаких оснований рассматривать какой-либо другой шаблонизатор, как только вы узнаете об этом.

1 голос
/ 19 сентября 2008
...