Вопрос

Я хочу использовать механизм шаблонов 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.
Это было полезно?

Решение

Решение простое.Это на самом деле хорошо документированы, но найти его не так-то просто.(Мне пришлось покопаться — он не появился, когда я попробовал несколько разных поисковых запросов в 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 (ссылку выше) для описания некоторых параметров, которые вы, возможно, захотите определить (в качестве аргументов ключевого слова для настройки).

Другие советы

Джинджа2 синтаксис во многом такой же, как и в Django, с очень небольшими отличиями, и вы получаете гораздо более мощный механизм шаблонов, который также компилирует ваш шаблон в байт-код (БЫСТРО!).

Я использую его для шаблонизации, в том числе и в самом 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'

Есть ли какая-то конкретная причина, по которой вы хотите использовать шаблоны Django?Оба Джинджа и Генши на мой взгляд, превосходят.


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

from django.conf import settings
settings.configure (FOO='bar') # Your settings go here

Я бы еще порекомендовал jinja2.Eсть хорошая статья на django против. jinja2 это дает некоторую подробную информацию о том, почему вам следует предпочесть последнее.

Согласно документации 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"

я бы сказал Джинджа также.Это определенно более могущественный чем движок шаблонов Django, и это стоять в одиночестве.

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

manage.py generatereports --format=html

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

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

Допустим, у вас есть этот важный тег шаблона в модуле 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}

Не.Использовать СтрокаШаблон вместо этого — нет причин рассматривать какой-либо другой шаблонизатор, если вы о нем знаете.

В дополнение к тому, что писали другие: если вы хотите использовать шаблон Django в 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})

Ошибка Джанго:Серверная часть DjangoTemplates не настроена.

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

Поддерживаю вышеизложенные утверждения.Jinja 2 — довольно хороший расширенный набор шаблонов Django для общего использования.Я думаю, они работают над тем, чтобы сделать шаблоны Django менее связанными с файлом settings.py, но Jinja вам подойдет.

Во время запуска manage.py оболочка:

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

Google AppEngine использует шаблонизатор Django. Вы видели, как они это делают?Возможно, вы могли бы просто использовать это.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top