web-dev-qa-db-fra.com

Comment utiliser les modèles Django sans le reste de Django?

Je souhaite utiliser le moteur de modèle Django dans mon code (Python), mais je ne crée pas de site Web basé sur Django. Comment l'utiliser sans avoir de fichier settings.py ( et autres) et avoir à définir la variable d'environnement Django_SETTINGS_MODULE?

Si j'exécute le code suivant:

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

Je reçois:

ImportError: Settings cannot be imported, because environment variable Django_SETTINGS_MODULE is undefined.
99
Daryl Spitzer

La solution est simple. C'est en fait bien documenté , mais pas trop facile à trouver. (J'ai dû fouiller - cela ne s'est pas produit lorsque j'ai essayé quelques recherches Google différentes.)

Le code suivant fonctionne:

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

Voir la documentation Django (liée ci-dessus) pour une description de certains des paramètres que vous voudrez peut-être définir (comme arguments de mot-clé à configurer).

131
Daryl Spitzer

Jinja2syntaxe est à peu près la même chose que Django avec très peu de différences, et vous obtenez un moteur de modèle beaucoup plus puissant, qui compile également votre modèle en bytecode (FAST!).

Je l'utilise pour les modèles, y compris dans Django lui-même, et c'est très bon. Vous pouvez également facilement écrire des extensions si certaines fonctionnalités que vous voulez manquent.

Voici une démonstration de la génération de code:

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

Une raison particulière pour laquelle vous souhaitez utiliser les modèles de Django? Jinja et Genshi sont, à mon avis, supérieurs.


Si vous le souhaitez, consultez la documentation Django sur settings.py . Surtout la section "Utilisation des paramètres sans définir Django_SETTINGS_MODULE ". Utilisez quelque chose comme ceci:

from Django.conf import settings
settings.configure (FOO='bar') # Your settings go here
9
John Millikin

Je recommanderais également jinja2. Il y a Nice article on Django vs. jinja2 qui donne des informations détaillées sur les raisons pour lesquelles vous devriez préférer la version ultérieure.

7
olt

Selon la documentation de Jinja, le support de Python 3 est encore expérimental . Donc, si vous êtes sur Python 3 et que les performances ne sont pas un problème, vous pouvez utiliser le moteur de modèle intégré de Django.

Django 1.8 a introduit la prise en charge de moteurs de modèles multiples qui nécessite une modification de la façon dont les modèles sont initialisés. Vous devez configurer explicitement settings.DEBUG qui est utilisé par le moteur de modèle par défaut fourni par Django. Voici le code pour utiliser des modèles sans utiliser le reste 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"
4
Pramod

Merci pour votre aide. Voici encore un ajout. Le cas où vous devez utiliser des balises de modèle personnalisées.

Disons que vous avez cette balise de modèle importante dans le module read.py

from Django import template

register = template.Library()

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

Voici le fichier de modèle html "temp.html":

{{var|bracewrap}}

Enfin, voici un script Python qui se liera à tous ensemble

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 sortie serait

{stackoverflow.com rox}
2
Gourneau

Je dirais aussi Jinja . Il est certainement plus puissant que Django Templating Engine et il est autonome .

S'il s'agissait d'un plugin externe vers une application Django existante, vous pouvez créer ne commande personnalisée et utiliser le moteur de création de modèles dans l'environnement de votre projet. Comme ceci;

manage.py generatereports --format=html

Mais je ne pense pas que cela vaille la peine d'utiliser le Django Templating Engine au lieu de Jinja.

2
muhuk

Non. Utilisez plutôt StringTemplate - il n'y a aucune raison d'envisager un autre moteur de modèle une fois que vous en avez connaissance.

1
Rob Williams
1
Lou Franco

En plus de ce que d'autres ont écrit, si vous souhaitez utiliser Django Template on Django> 1.7, vous devez donner votre appel settings.configure (...) la variable TEMPLATES et appelez Django.setup () comme ceci:

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

Ensuite, vous pouvez charger votre modèle comme d'habitude, à partir d'une chaîne:

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

Et si vous avez écrit la variable DIRS dans le .configure, à partir du disque:

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

Erreur Django: aucun backend DjangoTemplates n'est configuré

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

1

Lors de l'exécution de manage.py Coquille:

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

Google AppEngine utilise le moteur Django modèle, avez-vous regardé comment ils le font? Vous pouvez peut-être simplement l'utiliser.

0
William Keller

Je fais écho aux déclarations ci-dessus. Jinja 2 est un assez bon ensemble de modèles Django pour une utilisation générale. Je pense qu'ils travaillent à rendre les modèles Django un peu moins couplés aux paramètres .py, mais Jinja devrait bien faire pour vous.

0
Clint Ecker