Pregunta

Quiero usar el motor de plantillas Django en mi código (Python), pero no estoy creando un sitio web basado en Django.¿Cómo lo uso sin tener un archivo settings.py (y otros) y tener que configurar la variable de entorno DJANGO_SETTINGS_MODULE?

Si ejecuto el siguiente código:

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

Yo obtengo:

ImportError: Settings cannot be imported, because environment variable DJANGO_SETTINGS_MODULE is undefined.
¿Fue útil?

Solución

La solución es sencilla.en realidad es bien documentada, pero no demasiado fácil de encontrar.(Tuve que buscar más; no apareció cuando intenté algunas búsquedas diferentes en Google).

El siguiente código funciona:

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

Consulte la documentación de Django (vinculada arriba) para obtener una descripción de algunas de las configuraciones que quizás desee definir (como argumentos de palabras clave para configurar).

Otros consejos

Jinja2 sintaxis es prácticamente igual que el de Django con muy pocas diferencias, y obtienes un motor de plantillas mucho más potente, que también compila tu plantilla en código de bytes (¡RÁPIDO!).

Lo uso para crear plantillas, incluso en el propio Django, y es muy bueno.También puede escribir extensiones fácilmente si falta alguna característica que desee.

Aquí hay una demostración de la generación de código:

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

¿Alguna razón particular por la que quieras usar las plantillas de Django?Ambos Jinja y Genshi son, en mi opinión, superiores.


Si realmente quieres, entonces mira el Documentación de Django sobre settings.py.Especialmente la sección "Usar configuraciones sin configurar DJANGO_SETTINGS_MODULE".Utilice algo como esto:

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

También recomendaría jinja2.Hay un Buen articulo en django vs. jinja2 eso brinda información detallada sobre por qué debería preferir lo último.

Según la documentación de Jinja, La compatibilidad con Python 3 aún es experimental.Entonces, si está en Python 3 y el rendimiento no es un problema, puede usar el motor de plantillas integrado de Django.

Django 1.8 introdujo soporte para múltiples motores de plantillas lo que requiere un cambio en la forma en que se inicializan las plantillas.Tienes que configurar explícitamente settings.DEBUG que es utilizado por el motor de plantillas predeterminado proporcionado por Django.Aquí está el código para usar plantillas sin usar el resto de 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"

yo diría Jinja también.Definitivamente es mas poderoso que Django Templating Engine y es ser único.

Si se tratara de un complemento externo para una aplicación Django existente, podría crear un comando personalizado y utilice el motor de plantillas dentro del entorno de sus proyectos.Como esto;

manage.py generatereports --format=html

Pero no creo que valga la pena usar Django Templating Engine en lugar de Jinja.

Gracias por la ayuda amigos.Aquí hay una adición más.El caso en el que necesita utilizar etiquetas de plantilla personalizadas.

Digamos que tienes esta importante etiqueta de plantilla en el módulo read.py

from django import template

register = template.Library()

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

Este es el archivo de plantilla html "temp.html":

{{var|bracewrap}}

Finalmente, aquí hay un script de Python que los vinculará a todos.

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)

La salida sería

{stackoverflow.com rox}

No.Usar Plantilla de cadena en cambio, no hay razón para considerar ningún otro motor de plantillas una vez que lo conozca.

Además de lo que otros escribieron, si desea utilizar la plantilla Django en Django > 1.7, debe darle a su settings.configure(...) llamar a la variable TEMPLATES y llamar a django.setup() de esta manera:

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

Luego puedes cargar tu plantilla como normalmente, desde una cadena:

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

Y si escribiste la variable DIRS en el .configure, desde el disco:

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

Error de Django:No hay ningún backend de DjangoTemplates configurado

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

Me hago eco de las declaraciones anteriores.Jinja 2 es un superconjunto bastante bueno de plantillas de Django para uso general.Creo que están trabajando para hacer que las plantillas de Django estén un poco menos acopladas a settings.py, pero Jinja debería funcionar bien para ti.

Mientras ejecuta el manage.py caparazón:

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

Google AppEngine utiliza el motor de plantillas Django, ¿has visto cómo lo hacen?Posiblemente podrías usar eso.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top