나머지 Django없이 Django 템플릿을 어떻게 사용합니까?


101

(Python) 코드에서 Django 템플릿 엔진을 사용하고 싶지만 Django 기반 웹 사이트를 구축하지 않습니다. settings.py 파일 (및 기타)없이 DJANGO_SETTINGS_MODULE 환경 변수를 설정하지 않고 어떻게 사용합니까?

다음 코드를 실행하면 :

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

나는 얻다:

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

답변:


133

해결책은 간단합니다. 실제로 잘 문서화되어 있습니다. 되어 있지만 찾기가 너무 쉽지는 않습니다. (저는 주위를 파헤쳐 야했습니다. 몇 가지 다른 Google 검색을 시도했을 때 나타나지 않았습니다.)

다음 코드가 작동합니다.

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

(구성 할 키워드 인수로) 정의 할 수있는 일부 설정에 대한 설명은 Django 문서 (위에 링크 됨)를 참조하십시오.


13
그리고 파일에서 가져 오려면 : settings.configure (TEMPLATE_DIRS = ( ".",)) t = get_template ( 'test.html')
Bryce

settings.configure ()에 대한 문서는 여기에 있습니다 -docs.djangoproject.com/en/1.7/topics/settings
Scott

위의 "잘 문서화 된"링크에서 이것은 버전 1.7까지 사실입니다. 1.8부터는 필요하지 않은 것 같습니다.settings.configure() 더 이상 .
Olaf Dietsche 2015

다른 템플릿을 포함하거나 템플릿 상속을 사용하려면 위의 Bryce 솔루션이 필요합니다.
titusjan

6
추가로 템플릿 생성자 전에 django.setup ()을 호출해야했습니다.
Amit

44

Jinja2 구문 은 Django의 구문 과 거의 비슷하지만 차이점이 거의 없으며 템플릿을 바이트 코드로 컴파일하는 (FAST!) 훨씬 더 강력한 템플릿 엔진을 얻을 수 있습니다.

Django 자체를 포함하여 템플릿에 사용하며 매우 좋습니다. 원하는 기능이 누락 된 경우에도 쉽게 확장을 작성할 수 있습니다.

다음은 코드 생성에 대한 몇 가지 데모입니다.

>>> 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를 사용하고 있습니다. 왜냐하면 제가 꽤 익숙한 것을 원했지만 제 사용자 (배포 가능한 앱이기 때문에)가 Django를 설치하는 것을 원하지 않았기 때문입니다. 장점은 Jinja를 easy_install로 설치할 수 있다는 것입니다.
Xiong Chiamiov

4
장고는 easy_install로도 설치할 수 있습니다.
hegemon

Jinga는 아직 공식적으로 Python3을 지원하지 않습니다. 사이트에 따르면 아직 실험적입니다.
Pramod

9

Django의 템플릿을 사용하려는 특별한 이유가 있습니까? JinjaGenshi 는 모두 우월하다고 생각합니다.


정말로 원한다면 Django 문서를settings.py . 특히 "설정없이 설정 사용"섹션 DJANGO_SETTINGS_MODULE. 다음과 같이 사용하십시오.

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

7

jinja2도 추천합니다. 나중에 선호해야하는 이유에 대한 자세한 정보를 제공 하는 vs. 에 대한 멋진 기사 가 있습니다 .djangojinja2


{% set %}Twig 템플릿 엔진 (PHP)에 대한 구문과 동등성 때문에 Jinja2를 선호합니다 . 교차 플랫폼 코드를 항상 작성하는 것이 좋지만 성능 차이는 중요하지 않습니다. 예를 들어, Python은 항상 PHP보다 느리게 작동 하므로 성능이 필요한 경우 PHP, Twig 및 Symfony2 또는 기타를 사용하여 사이트를 만드는 것이 좋습니다. 슬프지만 진실.
Croll

@Croll, 웹 사이트가 복잡한 계산을 수행하는 경우 파이썬 라이브러리는 비교할 수 없을 정도로 빠르며, 그렇지 않으면 병목 현상이 데이터베이스이거나 정말 잘못된 방식으로 수행 할 가능성이 있습니다
Bob

4

Jinja 문서에 따르면 Python 3 지원은 아직 실험적 입니다. 따라서 Python 3을 사용 중이고 성능이 문제가되지 않는 경우 django의 기본 제공 템플릿 엔진을 사용할 수 있습니다.

Django 1.8은 템플릿이 초기화되는 방식을 변경해야하는 여러 템플릿 엔진에 대한 지원을 도입했습니다 . settings.DEBUGdjango에서 제공하는 기본 템플릿 엔진이 사용하는 것을 명시 적으로 구성해야합니다 . 다음은 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

다른 사람이 작성한 것 외에도 Django> 1.7에서 Django 템플릿을 사용하려면 settings.configure (...)에 TEMPLATES 변수를 호출하고 django.setup ()을 다음과 같이 호출해야합니다.

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

그런 다음 평소처럼 문자열에서 템플릿을로드 할 수 있습니다.

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

그리고 디스크에서 .configure에 DIRS 변수를 작성한 경우 :

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

Django 오류 : DjangoTemplates 백엔드가 구성되지 않았습니다.

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


2

진자 도 말하고 싶습니다 . Django Templating Engine보다 확실히 더 강력 하며 독립형 입니다.

이것이 기존 Django 응용 프로그램에 대한 외부 플러그인 경우 사용자 지정 명령을 만들고 프로젝트 환경 내에서 템플릿 엔진을 사용할 수 있습니다. 이렇게

manage.py generatereports --format=html

그러나 Jinja 대신 Django Templating Engine을 사용하는 것이 가치가 있다고 생각하지 않습니다.


2

도움을 주셔서 감사합니다. 여기에 하나 더 추가되었습니다. 사용자 지정 템플릿 태그를 사용해야하는 경우.

read.py 모듈에이 중요한 템플릿 태그가 있다고 가정 해 보겠습니다.

from django import template

register = template.Library()

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

다음은 html 템플릿 파일 "temp.html"입니다.

{{var|bracewrap}}

마지막으로, 여기에 모두 함께 연결되는 Python 스크립트가 있습니다.

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)

출력은 다음과 같습니다.

{stackoverflow.com rox}

django.template.base.add_to_builtins("read")ValueError나를 위해 a 를 올립니다 .
oarfish

TemplateDoesNotExist내가 django 1.10.1을 사용하고있는 오류를 제공 합니다
Vikrant Singh



0

나는 위의 진술을 반영합니다. Jinja 2는 일반적으로 사용되는 Django 템플릿의 훌륭한 수퍼 세트입니다. 나는 그들이 Django 템플릿을 settings.py와 조금 덜 결합시키는 작업을하고 있다고 생각하지만, Jinja는 당신을 위해 잘 할 것입니다.


0

manage.py셸을 실행하는 동안 :

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

0

Google AppEngine은 Django 템플릿 엔진을 사용합니다. 어떻게 작동하는지 살펴 보셨나요? 당신은 아마도 그것을 사용할 수 있습니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.