Как использовать шаблоны Django без остальной части Django?



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

13 ответов:

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

Jinja2синтаксис в значительной степени то же самое, что и 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? Оба Джимма и Genshi есть, на мой взгляд, отличный.


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

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

Я бы также рекомендовал jinja2. Там есть хорошая статья on 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 Templating Engine и это стоять в одиночестве.

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

manage.py generatereports --format=html

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

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

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

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

дополнение к тому, что другие написали, Если вы хотите использовать шаблон Django на Django > 1.7, вы должны дать свои настройки.формировать.(..) называют шаблоны переменной и вызов Джанго.настройка() такой :

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 в.настроить с диска :

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

ошибка Django: нет djangotemplates backend настроено

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

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

во время работы manage.py shell:

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

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

Comments

    Ничего не найдено.