python 함수 - 장고 나머지 템플릿없이 장고 템플릿을 어떻게 사용합니까?



부트스트랩 for문 (12)

내 (Python) 코드에서 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.

Answers

Django 템플릿을 Django> 1.7에서 사용하려면 다른 사람이 작성한 것에 덧붙여 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)

그리고 DIRS 변수를 디스크에서 .configure로 작성했다면 :

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

장고 오류 : DjangoTemplates 백엔드가 구성되어 있지 않습니다.

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



Jinja2 syntax 은 Django syntax 과 거의 다른 점이 많으며 템플릿을 바이트 코드 (FAST!)로 컴파일하는 훨씬 더 강력한 템플릿 엔진을 사용할 수 있습니다.

나는 장고 자체를 포함하여 templating을 위해 그것을 사용한다. 그리고 그것은 매우 좋다. 원하는 기능 중 일부가 누락 되어도 쉽게 내선 번호를 쓸 수 있습니다.

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

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

하지마. 대신 StringTemplate 을 사용하십시오. 다른 템플릿 엔진을 일단 알게되면 다른 템플릿 엔진을 사용할 이유가 없습니다.


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

이 중요한 템플릿 태그가 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': '.com rox'})

template = get_template("temp.html")
# Prepare context ....
print template.render(c)

출력은

{.com rox}

해결책은 간단합니다. 실제로 문서화 되었지만 찾기가 너무 쉽지는 않습니다. (나는 주위를 파야 만했다 - 내가 몇 가지 다른 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 설명서 (위 링크)를 참조하십시오.


나는 Jinja 도 말할 것입니다. 그것은 확실히 장고 템플릿 엔진 보다 강력 하고 독립적 입니다.

이것이 기존 Django 응용 프로그램의 외부 플러그 인 경우 , 사용자 정의 명령을 작성 하고 프로젝트 환경에서 템플리트 엔진을 사용할 수 있습니다. 이것 같이;

manage.py generatereports --format=html

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


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

정말로 원한다면 settings.py 대한 장고 문서 를보십시오. 특히 " DJANGO_SETTINGS_MODULE 설정없이 설정 사용"절. 다음과 같이 사용하십시오.

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

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

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

나는 또한 jinja2를 추천 할 것이다. djangojinja2 에 대한 훌륭한 기사 가 있습니다.이 기사에서는 왜 나중에 prefere해야하는지에 대한 세부 정보를 제공합니다.


Jinja 문서에 따르면 Python 3 지원은 아직 실험 중 입니다. 따라서 파이썬 3에서 성능에 문제가 없다면 django에 내장 된 템플릿 엔진을 사용할 수 있습니다.

Django 1.8은 템플릿이 초기화되는 방식을 변경해야하는 다중 템플릿 엔진에 대한 지원을 도입했습니다. django가 제공하는 기본 템플릿 엔진에서 사용하는 settings.DEBUG 을 명시 적으로 구성해야합니다. 다음은 나머지 장고를 사용하지 않고 템플릿을 사용하는 코드입니다.

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"

isfile() 과 달리 exists() 는 디렉토리에 대해 True 를 반환합니다.
따라서 일반 파일이나 디렉토리 만 원한다면 isfile() 또는 exists() . 다음은 간단한 REPL 출력입니다.

>>> print os.path.isfile("/etc/password.txt")
True
>>> print os.path.isfile("/etc")
False
>>> print os.path.isfile("/does/not/exist")
False
>>> print os.path.exists("/etc/password.txt")
True
>>> print os.path.exists("/etc")
True
>>> print os.path.exists("/does/not/exist")
False




python django templates django-templates template-engine