ฉันจะใช้เทมเพลต Django โดยไม่เหลือ Django ได้อย่างไร


101

ฉันต้องการใช้เครื่องมือเทมเพลต Django ในโค้ด (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.

คำตอบ:


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/th/1.7/topics/settings
Scott

จากลิงก์ "เอกสารที่ดี" ด้านบนนี้เป็นจริงจนถึงเวอร์ชัน 1.7 เริ่มจาก 1.8 ดูเหมือนว่าคุณไม่ต้องการsettings.configure()อีกต่อไป
Olaf Dietsche

หากคุณต้องการรวมเทมเพลตอื่น ๆ หรือใช้การสืบทอดเทมเพลตจำเป็นต้องใช้โซลูชันข้างต้นโดย Bryce
titusjan

6
ฉันจำเป็นต้องเรียกใช้ django.setup () ก่อนตัวสร้างเทมเพลต
Amit

44

ไวยากรณ์Jinja2ค่อนข้างเหมือนกับ Django ที่มีความแตกต่างน้อยมากและคุณจะได้รับเอ็นจิ้นเทมเพลตที่มีประสิทธิภาพมากขึ้นซึ่งจะรวบรวมเทมเพลตของคุณเป็น bytecode (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
Django สามารถติดตั้งด้วย easy_install ได้เช่นกัน
hegemon

Jinga ยังไม่รองรับ Python3 อย่างเป็นทางการ ตามเว็บไซต์ยังอยู่ในช่วงทดลอง
ประมวล

9

เหตุผลใดที่คุณต้องการใช้เทมเพลตของ Django ในความคิดของฉันทั้งJinjaและGenshiนั้นเหนือกว่า


หากคุณต้องการจริงๆแล้วดูเอกสาร Django settings.pyบน โดยเฉพาะส่วน "การใช้การตั้งค่าโดยไม่ตั้งค่าDJANGO_SETTINGS_MODULE". ใช้สิ่งนี้:

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

7

ฉันอยากจะแนะนำ jinja2 ด้วย มีบทความดีๆเกี่ยวdjangoกับเทียบกับjinja2ที่ให้ข้อมูลโดยละเอียดเกี่ยวกับสาเหตุที่คุณควรเลือกในภายหลัง


ฉันชอบ Jinja2 เพราะ{% set %}ไวยากรณ์และความเท่าเทียมกับ Twig template engine (PHP) การเขียนโค้ดข้ามแพลตฟอร์มจะดีกว่าเสมอ แต่ความแตกต่างของประสิทธิภาพนั้นไม่สำคัญเช่นpython จะทำงานช้ากว่า PHPเสมอดังนั้นหากคุณต้องการประสิทธิภาพคุณควรสร้างไซต์ด้วย PHP, Twig และ Symfony2 หรืออื่น ๆ เศร้า แต่ความจริง
Croll

@Croll หากเว็บไซต์ของคุณทำการคำนวณที่ซับซ้อนไลบรารี python จะเร็วกว่าอย่างไม่มีใครเทียบได้มิฉะนั้นคอขวดเป็นฐานข้อมูลหรือคุณมีแนวโน้มที่จะทำอะไรผิดพลาดจริงๆ
Bob

4

ตามเอกสาร Jinja, งูหลาม 3 การสนับสนุนยังคงทดลอง ดังนั้นหากคุณใช้ Python 3 และประสิทธิภาพไม่ใช่ปัญหาคุณสามารถใช้เครื่องมือเทมเพลตในตัวของ django

Django 1.8 แนะนำการสนับสนุนสำหรับเอนจินแม่แบบหลายตัวซึ่งต้องมีการเปลี่ยนแปลงวิธีเริ่มต้นเทมเพลต คุณต้องกำหนดค่าอย่างชัดเจนsettings.DEBUGซึ่งถูกใช้โดยเครื่องมือเทมเพลตเริ่มต้นที่ django จัดเตรียมไว้ให้ นี่คือรหัสสำหรับใช้เทมเพลตโดยไม่ต้องใช้ 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 Template บน Django> 1.7 คุณต้องให้การตั้งค่าของคุณกำหนดค่า (... ) เรียกตัวแปร 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 ในรูปแบบ. config จากดิสก์:

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 เครื่องยนต์และเป็นที่ยืนอยู่คนเดียว

หากนี่เป็นปลั๊กภายนอกของแอปพลิเคชัน Django ที่มีอยู่คุณสามารถสร้างคำสั่งที่กำหนดเองและใช้โปรแกรมสร้างเทมเพลตภายในสภาพแวดล้อมโครงการของคุณ แบบนี้;

manage.py generatereports --format=html

แต่ฉันไม่คิดว่ามันคุ้มที่จะใช้ Django Templating Engine แทน Jinja


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ให้ฉัน
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)

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.