109 votes

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

Je souhaite utiliser le moteur de modèles de Django dans mon code (Python), mais je ne construis pas de site web basé sur Django. Comment puis-je l'utiliser sans avoir un fichier settings.py (et autres) et sans devoir 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 }}.')

J'ai compris :

ImportError: Settings cannot be imported, because environment variable DJANGO_SETTINGS_MODULE is undefined.

138voto

Daryl Spitzer Points 18304

La solution est simple. Il s'agit en fait bien documenté mais pas trop facile à trouver. (J'ai dû creuser -- il n'est pas apparu lorsque j'ai essayé plusieurs recherches différentes sur Google).

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

Consultez la documentation de Django (dont le lien figure ci-dessus) pour une description de certains des paramètres que vous pouvez vouloir définir (en tant qu'arguments de mots-clés pour configurer).

47voto

nosklo Points 75862

Jinja2 syntaxe est à peu près le même que celui de Django, avec très peu de différences, et vous disposez d'un moteur de modèles beaucoup plus puissant, qui compile également votre modèle en bytecode (RAPIDEMENT !).

Je l'utilise pour la création de modèles, y compris dans Django lui-même, et il est très bon. Vous pouvez aussi facilement écrire des extensions si une fonctionnalité que vous souhaitez est manquante.

Voici une démonstration de la génération du 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'

10voto

John Millikin Points 86775

Avez-vous une raison particulière d'utiliser les modèles de Django ? Les deux Jinja y Genshi sont, à mon avis, supérieurs.


Si vous voulez vraiment le faire, alors voyez le Documentation de Django sur settings.py . En particulier, la section "Utilisation des paramètres sans réglage DJANGO_SETTINGS_MODULE ". Utilisez quelque chose comme ceci :

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

7voto

olt Points 899

Je recommande également jinja2. Il y a un bel article sur django vs. jinja2 qui donne des informations détaillées sur les raisons pour lesquelles vous devriez préférer le dernier.

2voto

muhuk Points 6526

Je dirais Jinja également. C'est définitivement plus puissant que Django Templating Engine et il est se suffire à lui-même .

S'il s'agissait d'un plug externe à une application Django existante, vous pourriez créer une commande personnalisée et utiliser le moteur de création de modèles dans l'environnement de vos projets. Comme ceci ;

manage.py generatereports --format=html

Mais je ne pense pas que cela vaille la peine d'utiliser le moteur de création de modèles de Django au lieu de Jinja.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X