Frage

Ich mag die Django Template-Engine verwenden, in meinem (Python) Code, aber ich bin nicht eine Django-basierte Web-Site aufzubauen. Wie verwende ich es ohne eine settings.py Datei mit (und anderen) und mit der DJANGO_SETTINGS_MODULE Umgebungsvariable setzen?

Wenn ich den folgenden Code:

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

ich:

ImportError: Settings cannot be imported, because environment variable DJANGO_SETTINGS_MODULE is undefined.
War es hilfreich?

Lösung

Die Lösung ist einfach. Es ist eigentlich gut dokumentiert , aber nicht zu leicht zu finden. (Ich hatte um zu graben -. Es ist nicht gekommen, wenn ich ein paar verschiedene Google-Suchanfragen versucht)

Der folgende Code funktioniert:

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

Sehen Sie die Django-Dokumentation (oben verlinkten) für eine Beschreibung von einigen der Einstellungen, die Sie definieren möchten, können (als Keyword-Argumente zu konfigurieren).

Andere Tipps

Jinja2

Jeder besonderer Grund Sie Djangos Vorlagen verwenden? Sowohl Jinja und Genshi ist, meiner Meinung nach, überlegen.


Wenn Sie wirklich wollen, dann finden Sie in der Django Dokumentation auf settings.py . Vor allem der Bereich „Einstellungen verwenden, ohne DJANGO_SETTINGS_MODULE Einstellung“. Verwenden Sie so etwas wie folgt aus:

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

Ich würde auch jinja2 empfehlen. Es gibt ein schöner Artikel auf django vs. jinja2, dass einige im Detail Informationen gibt an, warum Sie die später prefere sollte.

Nach der Dokumentation Jinja, Python 3 Unterstützung ist nach wie vor Versuch . Also, wenn Sie auf Python 3 und Performance ist kein Problem, können Sie Djangos in Template-Engine gebaut verwenden.

Django 1.8 eingeführte Unterstützung für welche erfordert die Art und Weise eine Änderung Vorlagen initialisiert werden. Sie müssen explizit settings.DEBUG konfigurieren, die von der Standard-Template-Engine von django vorgesehen verwendet wird. Hier ist der Code-Vorlagen zu verwenden, ohne den Rest django zu verwenden.

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"

Ich würde sagen, Jinja auch. Es ist auf jeden Fall mächtiger als Django Template-Engine und es ist stand alone .

Wenn dies ein externer Stecker an eine bestehende Django-Anwendung war, konnte man a href erstellen <= "http://docs.djangoproject.com/en/dev/howto/custom-management-commands/#howto-custom- Management-Befehle“rel =‚nofollow noreferrer‘> ein benutzerdefinierter Befehl und verwenden Sie die Template-Engine in Ihren Projekten Umgebung. Wie dies;

manage.py generatereports --format=html

Aber ich glaube nicht, ist es wert, nur die Django Template-Engine anstelle von Jinja verwendet wird.

Vielen Dank für die Hilfe Leute. Hier ist eine weitere Ergänzung. Der Fall, in dem Sie benötigen, um benutzerdefinierte Vorlagen-Tags verwendet werden.

Angenommen, Sie haben diesen wichtigen Template-Tag in dem Modul read.py haben

from django import template

register = template.Library()

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

Dies ist die HTML-Template-Datei "temp.html":

{{var|bracewrap}}

Schließlich, hier ist ein Python-Skript, das für alle zusammen

binden wird
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)

Der Ausgang wäre

{stackoverflow.com rox}

Nicht. Verwenden Sie String statt -. Es gibt keinen Grund, andere Template-Engine zu prüfen, sobald man darüber wissen

Eine Ergänzung zu dem, was andere geschrieben, wenn Sie Django Vorlage auf Django> 1.7 verwenden möchten, können Sie Ihre settings.configure geben muss (...), um die VORLAGEN Variable rufen und rufen django.setup () wie folgt aus:

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

Dann können Sie Ihre Vorlage laden wie normalerweise aus einem String:

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

Und wenn Sie die DIRS Variable in der .configure schreiben, von der Festplatte:

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

Django Fehler: Kein DjangoTemplates Backend konfiguriert ist

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

I echo die obigen Ausführungen. Jinja 2 ist eine ziemlich gute Obermenge von Django-Vorlagen für den allgemeinen Gebrauch. Ich glaube, sie arbeiten daran, die Django etwas weniger Vorlagen zum settings.py gekoppelt, aber Jinja sollte für Sie tun gut.

Während die manage.py Shell ausgeführt wird:

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

Google AppEngine verwendet den Motor Django Templating, haben Sie einen Blick auf, wie sie es tun genommen? Sie könnten möglicherweise nur, dass verwenden.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top