Django şablonlarını Django'nun geri kalanı olmadan nasıl kullanırım?


101

(Python) kodumda Django şablon motorunu kullanmak istiyorum, ancak Django tabanlı bir web sitesi oluşturmuyorum. Bir settings.py dosyası (ve diğerleri) olmadan ve DJANGO_SETTINGS_MODULE ortam değişkenini ayarlamak zorunda kalmadan nasıl kullanırım?

Aşağıdaki kodu çalıştırırsam:

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

Alırım:

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

Yanıtlar:


133

Çözüm basit. Aslında iyi belgelenmiştir , ancak bulunması çok kolay değildir. (Etrafı araştırmak zorunda kaldım - birkaç farklı Google aramasını denediğimde ortaya çıkmadı.)

Aşağıdaki kod çalışır:

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

Tanımlamak isteyebileceğiniz bazı ayarların açıklaması için (yapılandırılacak anahtar sözcük bağımsız değişkenleri olarak) Django belgelerine (yukarıda bağlantı verilen) bakın.


13
Ve bir dosyadan almak için: settings.configure (TEMPLATE_DIRS = (".",)) T = get_template ('test.html')
Bryce

Settings.configure () belgeleri burada - docs.djangoproject.com/en/1.7/topics/settings
Scott

Yukarıdaki "iyi belgelenmiş" bağlantıdan, bu 1.7 sürümüne kadar geçerlidir. 1.8'den başlayarak, settings.configure()artık ihtiyacınız yok gibi görünüyor .
Olaf Dietsche

Başka şablonlar eklemek veya şablon devralma kullanmak istiyorsanız, yukarıdaki Bryce çözümü gereklidir.
titusjan

6
Ayrıca Template yapıcısından önce django.setup () 'ı çağırmam gerekiyordu.
Amit

44

Jinja2 sözdizimi , Django'nun çok az farkıyla hemen hemen aynıdır ve şablonunuzu bayt koduna (HIZLI!) Derleyen çok daha güçlü bir şablon motoru elde edersiniz.

Onu Django'nun kendisi de dahil olmak üzere şablon yapmak için kullanıyorum ve çok iyi. İstediğiniz bazı özellikler eksikse, uzantıları da kolayca yazabilirsiniz.

İşte kod oluşturmanın bazı gösterileri:

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

4
Jinja'yı bir projemde kullanıyorum çünkü oldukça aşina olduğum bir şey istedim, ancak kullanıcılarımın (dağıtılabilir bir uygulama olduğu için) Django'yu yüklemesini istemedim. Bir artı, Jinja'nın easy_install ile kurulabilmesidir.
Xiong Chiamiov

4
Django, easy_install ile de kurulabilir.
hegemon

Jinga henüz resmi olarak Python3'ü desteklemiyor. Siteye göre hala deneysel.
Pramod

9

Django'nun şablonlarını kullanmak istemenizin özel bir nedeni var mı? Hem Jinja hem de Genshi bence daha üstün.


Gerçekten istiyorsanız, Django belgelerinesettings.py bakın . Özellikle "Ayar yapmadan ayarların kullanılması DJANGO_SETTINGS_MODULE" bölümü . Bunun gibi bir şey kullanın:

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

7

Ayrıca jinja2'yi de tavsiye ederim. Bir yoktur güzel makale üzerinde djangovs. jinja2daha sonra prefere niçin bazı in-detay bilgi verir.


{% set %}Sözdizimi ve Twig şablon motoruna (PHP) eşitliği nedeniyle Jinja2'yi tercih ediyorum . Her zaman çapraz platform kodu yazmak daha iyidir, ancak performans farkı kritik değildir - örneğin, python her zaman PHP'den daha yavaş çalışacaktır, bu nedenle performansa ihtiyacınız varsa PHP, Twig ve Symfony2 veya başka bir şeyle daha iyi site oluşturursunuz. Üzücü ama gerçek.
Croll

@Croll, Web siteniz karmaşık hesaplamalar yapıyorsa, python kitaplıkları benzersiz bir şekilde daha hızlıdır, aksi takdirde darboğaz veritabanıdır veya muhtemelen gerçekten yanlış bir şey yapıyorsunuzdur
Bob

4

Jinja belgelerine göre Python 3 desteği hala deneysel . Dolayısıyla, Python 3'teyseniz ve performans bir sorun değilse, django'nun yerleşik şablon motorunu kullanabilirsiniz.

Django 1.8 , şablonların başlatılma biçiminde bir değişiklik gerektiren birden çok şablon motoru için destek getirdi . settings.DEBUGDjango tarafından sağlanan varsayılan şablon motoru tarafından kullanılacak olanı açıkça yapılandırmanız gerekir . İşte django'nun geri kalanını kullanmadan şablonları kullanmanın kodu.

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

Başkalarının yazdıklarına ek olarak, Django Şablonunu Django> 1.7'de kullanmak istiyorsanız, settings.configure (...) ŞABLONLAR değişkenini ve django.setup () 'ı şu şekilde çağırmalısınız:

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

Ardından şablonunuzu normalde olduğu gibi bir dizeden yükleyebilirsiniz:

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

Ve DIRS değişkenini .configure dosyasına diskten yazdıysanız:

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

Django Hatası: DjangoTemplates arka ucu yapılandırılmamış

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


2

Ben de Jinja diyebilirim . Kesinlikle Django Şablonlama Motorundan daha güçlü ve tek başına .

Bu, mevcut bir Django uygulamasının harici bir eklentisiyse, özel bir komut oluşturabilir ve şablon oluşturma motorunu projeler ortamınızda kullanabilirsiniz. Bunun gibi;

manage.py generatereports --format=html

Ama Jinja yerine sadece Django Şablonlama Motorunu kullanmaya değeceğini sanmıyorum.


2

Yardımlarınız için teşekkürler millet. İşte bir ekleme daha. Özel şablon etiketlerini kullanmanız gereken durum.

Diyelim ki read.py modülünde bu önemli şablon etiketi var

from django import template

register = template.Library()

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

Bu html şablon dosyası "temp.html" dir:

{{var|bracewrap}}

Son olarak, işte birbirine bağlanacak bir Python betiği

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)

Çıktı olacaktır

{stackoverflow.com rox}

django.template.base.add_to_builtins("read")ValueErrorbenim için bir yükseltir .
kürek balığı

TemplateDoesNotExisthata veriyor django 1.10.1 kullanıyorum
Vikrant Singh



0

Yukarıdaki ifadeleri yineliyorum. Jinja 2, genel kullanım için Django şablonlarının oldukça iyi bir üst kümesidir. Sanırım Django şablonlarını settings.py ile biraz daha az birleştirmek için çalışıyorlar, ancak Jinja sizin için daha iyi olmalı.


0

manage.pyKabuğu çalıştırırken :

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

0

Google AppEngine, Django şablonlama motorunu kullanıyor, bunu nasıl yaptıklarına bir göz attınız mı? Muhtemelen bunu kullanabilirsin.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.