2008-09-18 3 views
94

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

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

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

ответ

127

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

+12

И получить его из файла: settings.configure ( TEMPLATE_DIRS = (,) "") т = get_template ('test.html') – Bryce 2013-09-16 06:51:04

+0

Документация для settings.configure() находится здесь - https://docs.djangoproject.com/en/1.7/topics/settings/ – Scott 2015-02-28 05:52:45

+0

Из вышеперечисленной ссылки «хорошо документировано» это верно вплоть до версии 1.7. Начиная с 1.8, вам больше не нужно `settings.configure()`. – 2015-07-27 19:56:57

9

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


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

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

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

40

Jinja2syntax почти такой же, как у 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' 
0

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

7

Я также рекомендую jinja2. Существует nice article на django против jinja2, в котором содержится подробная информация о том, почему вы должны предпочесть позже.

1

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

2

Я бы сказал, Jinja.Это, безусловно, более мощный чем Django Templating Engine, и это отдельно стоящий.

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

manage.py generatereports --format=html 

Но я не думаю, что стоит просто использовать Jango Templating Engine вместо Jinja.

0

Во время работы manage.py оболочки:

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

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

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

Согласно документации Jinja, Python 3 support is still experimental. Итак, если вы находитесь на Python 3, и производительность не является проблемой, вы можете использовать встроенный механизм шаблонов django.

Django 1.8 представил поддержку для multiple template engines, которая требует изменения способа инициализации шаблонов. Вы должны явно настроить 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" 
0

Добавка к тому, что другие писали, если вы хотите использовать Django шаблон на Django> 1.7, вы должны дать settings.configure (...) называют переменную ШАБЛОНЫ и называют 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 Error: No DjangoTemplates backend is configured

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

 Смежные вопросы

  • Нет связанных вопросов^_^