Como faço para usar os modelos de Django sem o resto do Django?

votos
95

Eu quero usar o mecanismo de modelo Django no meu código (Python), mas eu não estou construindo um web site baseado em Django. Como faço para usá-lo sem ter um arquivo settings.py (e outros) e ter que definir a variável de ambiente DJANGO_SETTINGS_MODULE?

Se eu executar o seguinte código:

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

Eu recebo:

ImportError: Settings cannot be imported, because environment variable DJANGO_SETTINGS_MODULE is undefined.
Publicado 19/09/2008 em 00:55
fonte usuário
Em outras línguas...                            


13 respostas

votos
129

A solução é simples. Na verdade, é bem documentado , mas não muito fácil de encontrar. (Eu tive que cavar em volta - ele não veio quando eu tentei algumas diferentes pesquisas do Google.)

O código a seguir 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 a documentação do Django (ligada acima) para uma descrição de algumas das configurações que você pode querer definir (como argumentos para configurar).

Respondeu 19/09/2008 em 01:01
fonte usuário

votos
40

Jinja2 sintaxe é praticamente o mesmo que o Django com muito poucas diferenças, e você terá um modelo de motor muito mais potente, que também compila seu modelo para bytecode (FAST!).

Eu uso ele para modelagem, inclusive no próprio Django, e é muito bom. Você também pode facilmente escrever extensões se algum recurso que você quer está em falta.

Aqui estão algumas demonstração da geração 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'
Respondeu 19/09/2008 em 01:08
fonte usuário

votos
9

Alguma razão em particular que deseja utilizar modelos do Django? Ambos Jinja e Genshi são, na minha opinião, superior.


Se você realmente quer, em seguida, ver a documentação do Django onsettings.py . Especialmente a seção "Usando as configurações sem definir DJANGO_SETTINGS_MODULE". Usar algo como isto:

from django.conf import settings
settings.configure (FOO='bar') # Your settings go here
Respondeu 19/09/2008 em 00:56
fonte usuário

votos
7

Eu recomendaria também Jinja2. Há um belo artigo sobre djangovs. jinja2que dá algumas informações em detalhes sobre por que você deve prefere o mais tarde.

Respondeu 20/09/2008 em 22:02
fonte usuário

votos
3

De acordo com a documentação Jinja, suporte Python 3 ainda é experimental . Então, se você estiver em Python 3 e desempenho não é um problema, você pode usar o Django é construído em modelo de motor.

Django 1.8 introduziu suporte para vários motores de modelo que requer uma alteração na forma como modelos são inicializados. Você tem que configurar explicitamente settings.DEBUGque é usado pelo motor modelo padrão fornecido pelo Django. Aqui está o código para usar modelos sem usar o resto do 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"
Respondeu 28/12/2015 em 14:00
fonte usuário

votos
2

Graças para os povos de ajuda. Aqui está mais uma adição. O caso em que você precisa usar tags de modelos personalizados.

Vamos dizer que você tem esta importante marca de modelo na read.py módulo

from django import template

register = template.Library()

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

Este é o arquivo de modelo html "temp.html":

{{var|bracewrap}}

Finalmente, aqui está um script Python que vai amarrar a todos juntos

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)

A saída seria

{stackoverflow.com rox}
Respondeu 09/12/2013 em 21:37
fonte usuário

votos
2

Eu diria Jinja também. É definitivamente mais poderoso do que Django Templating Motor e é ficar sozinho .

Se este era um plug externo para uma aplicação Django existente, você pode criar um comando personalizado e usar o motor de templates no seu ambiente de projetos. Como isso;

manage.py generatereports --format=html

Mas eu não acho que vale a pena apenas usando o Templating Motor Django em vez de Jinja.

Respondeu 05/12/2008 em 23:15
fonte usuário

votos
1

Não. Use StringTemplate vez - não há nenhuma razão para considerar qualquer outro modelo de motor uma vez que você sabe sobre ele.

Respondeu 20/11/2008 em 03:43
fonte usuário

votos
1

Encontrado presente:

http://snippets.dzone.com/posts/show/3339

Respondeu 19/09/2008 em 00:58
fonte usuário

votos
0

Um complemento para o outro escreveu, se você quiser usar o modelo Django Django em> 1.7, você deve dar o seu settings.configure (...) chamar a variável modelos e chamar django.setup () como este:

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

Em seguida, você pode carregar o seu modelo como normalmente, a partir de uma string:

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

E se você escreveu a variável DIRS na .configure, a partir do disco:

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

Django Erro: Nenhuma DjangoTemplates backend está configurado

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

Respondeu 24/11/2017 em 02:00
fonte usuário

votos
0

Durante a execução do manage.pyshell:

>>> from django import template   
>>> t = template.Template('My name is ` me `.')   
>>> c = template.Context({'me': 'ShuJi'})   
>>> t.render(c)
Respondeu 17/07/2012 em 09:50
fonte usuário

votos
0

Faço minhas as afirmações acima. Jinja 2 é um bom super conjunto de modelos de Django para uso geral. Acho que eles estão trabalhando para tornar o Django modelos um pouco menos acoplado ao settings.py, mas Jinja deve fazer bem para você.

Respondeu 19/09/2008 em 01:18
fonte usuário

votos
0

Google AppEngineusa o motor de templates Django, você deu uma olhada em como eles fazem isso? Você poderia apenas usar isso.

Respondeu 19/09/2008 em 00:57
fonte usuário

Cookies help us deliver our services. By using our services, you agree to our use of cookies. Learn more