2008-09-18 12 views
94

मैं अपने (पायथन) कोड में Django टेम्पलेट इंजन का उपयोग करना चाहता हूं, लेकिन मैं Django- आधारित वेबसाइट नहीं बना रहा हूं। मैं सेटिंग.py फ़ाइल (और अन्य) के बिना इसका उपयोग कैसे करूं और DJANGO_SETTINGS_MODULE पर्यावरण चर सेट करने के लिए?मैं डीजेगो के बाकी हिस्सों के बिना Django टेम्पलेट्स का उपयोग कैसे करूं?

अगर मैं निम्नलिखित कोड चलाएँ:

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

उत्तर

127

समाधान सरल है। यह वास्तव में well documented है, लेकिन खोजने के लिए बहुत आसान नहीं है।

>>> 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 प्रलेखन (ऊपर लिंक) देखें:

निम्नलिखित कोड काम करता है - (यह नहीं आया था जब मैं कुछ अलग गूगल खोजों की कोशिश की मैं आसपास खुदाई करने के लिए किया था।) कुछ सेटिंग्स का विवरण जिन्हें आप परिभाषित करना चाहते हैं (कॉन्फ़िगर करने के लिए कीवर्ड तर्क के रूप में)।

+12

और से एक फ़ाइल इसे पाने के लिए: settings.configure ("।" TEMPLATE_DIRS = (,) ) टी = get_template ('test.html') – Bryce

+0

सेटिंग्स.configure() के लिए प्रलेखन यहां है - https://docs.djangoproject.com/en/1.7/topics/settings/ – Scott

+0

उपरोक्त "अच्छी तरह से प्रलेखित" लिंक से, यह संस्करण 1.7 तक सही है। 1 से शुरू8, ऐसा लगता है कि आपको अब 'settings.configure() 'की आवश्यकता नहीं है। –

9

कोई विशेष कारण आप Django के टेम्पलेट का उपयोग करना चाहते हैं? Jinja और Genshi दोनों मेरी राय में, श्रेष्ठ हैं।


यदि आप वास्तव में चाहते हैं, तो Django documentation on settings.py देखें। विशेष रूप से अनुभाग "DJANGO_SETTINGS_MODULE सेट किए बिना सेटिंग्स का उपयोग करना"। कुछ इस तरह का उपयोग करें:

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

गूगल AppEngine Django templating इंजन का उपयोग करता है, तो आप कैसे वे इसे कर पर एक नज़र ले लिया है? आप शायद इसका उपयोग कर सकते हैं।

40

Jinja2syntax काफी Django के बहुत कम अंतर के साथ के रूप में ही है, और आप एक और अधिक शक्तिशाली टेम्पलेट इंजन है, जो भी बाईटकोड को अपने टेम्पलेट संकलित मिल (फास्ट!)।

मैं इसे 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

मैं अपने प्रोजेक्ट में जिन्जा का उपयोग कर रहा हूं, क्योंकि मुझे कुछ ऐसा चाहिए जो मैं काफी परिचित था, लेकिन नहीं चाहता था कि मेरे उपयोगकर्ता (क्योंकि यह एक वितरित ऐप है) Django को स्थापित करना है। एक प्लस यह है कि Jinja easy_install के साथ स्थापित किया जा सकता है। –

+4

Django को easy_install के साथ भी इंस्टॉल किया जा सकता है। – hegemon

+0

जिंगा आधिकारिक तौर पर Python3 का समर्थन नहीं करता है। साइट के अनुसार, यह अभी भी प्रयोगात्मक है। – Pramod

0

मैं ऊपर बयान गूंज:

यहाँ कोड पीढ़ी के कुछ प्रदर्शन है। Jinja 2 सामान्य उपयोग के लिए Django टेम्पलेट्स का एक बहुत अच्छा सुपरसैट है। मुझे लगता है कि वे Django टेम्पलेट्स को सेटिंग.py के साथ थोड़ा कम बनाने पर काम कर रहे हैं, लेकिन जिनजा को आपके लिए अच्छा करना चाहिए।

7

मैं भी jinja2 की सिफारिश करेंगे। nice articledjango बनाम jinja2 पर है जो आपको बाद में क्यों पेश करना चाहिए इस पर कुछ विस्तार से जानकारी देता है।

+0

मैं '{% set%}' वाक्यविन्यास और Twig टेम्पलेट इंजन (PHP) के समानता के कारण Jinja2 पसंद करता हूं। हमेशा क्रॉस प्लेटफॉर्म कोड लिखना बेहतर होता है, लेकिन प्रदर्शन अंतर महत्वपूर्ण नहीं है - उदाहरण के लिए, ** पायथन हमेशा PHP से धीमे काम करेगा ** इसलिए यदि आपको प्रदर्शन की आवश्यकता है तो आप PHP, Twig और Symfony2 के साथ साइट को बेहतर बनाते हैं। दुखद लेकिन सच्चाई। – Croll

+0

@Croll, यदि आपकी वेबसाइट जटिल कंप्यूटेशंस करती है तो पाइथन लाइब्रेरी असम्पीडित रूप से तेज़ी से होती है, अन्यथा बाधा डेटाबेस होती है या आप शायद कुछ गलत तरीके से गलत तरीके से कर रहे हैं – Bob

1

मत करो। इसके बजाय StringTemplate का उपयोग करें - इसके बारे में जानने के बाद किसी भी अन्य टेम्पलेट इंजन पर विचार करने का कोई कारण नहीं है।

+0

बोल्ड दावा! संपर्क? –

+0

पायथन पोर्ट बहुत जावा जैसा दिखता है। यह पाइथोनिक नहीं है। –

2

मैं Jinja रूप में अच्छी तरह कहेंगे।यह निश्चित रूप से Django टेम्पलेटिंग इंजन की तुलना में अधिक शक्तिशाली है और यह अकेले खड़े है।

यदि यह मौजूदा Django एप्लिकेशन के लिए एक बाहरी प्लग था, तो आप a custom command बना सकते हैं और अपने प्रोजेक्ट वातावरण के भीतर टेम्पलेटिंग इंजन का उपयोग कर सकते हैं। इस कदर;

manage.py generatereports --format=html 

लेकिन मुझे नहीं लगता कि यह केवल जिन्जा के बजाय डीजेगो टेम्पलेटिंग इंजन का उपयोग करने योग्य है।

0

जबकि manage.py खोल चल:

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

मदद लोगों के लिए धन्यवाद। यहां एक और जोड़ा है। वह मामला जहां आपको कस्टम टेम्पलेट टैग का उपयोग करने की आवश्यकता है।

मान लीजिए कि आप मॉड्यूल read.py में इस महत्वपूर्ण टेम्पलेट टैग करते हैं

from django import template 

register = template.Library() 

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

यह एचटीएमएल टेम्पलेट फ़ाइल "temp.html" है:

{{var|bracewrap}} 

अंत में, यहाँ एक अजगर है स्क्रिप्ट कि सभी को एक साथ करने के लिए टाई होगा

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} 
+0

'django.template.base.add_to_builtins (" पढ़ें ") 'मेरे लिए' ValueError' उठाता है। – oarfish

+0

'टेम्पलेट DoesNotExist' त्रुटि देता है मैं django 1.10.1 का उपयोग कर रहा हूँ –

3

जिंजा प्रलेखन, Python 3 support is still experimental के अनुसार। तो यदि आप पाइथन 3 पर हैं और प्रदर्शन कोई मुद्दा नहीं है, तो आप django के टेम्पलेट इंजन में निर्मित का उपयोग कर सकते हैं।

Django 1.8 ने multiple template engines के लिए समर्थन प्रस्तुत किया जिसके लिए टेम्पलेट प्रारंभ करने के तरीके में बदलाव की आवश्यकता है। आपको 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" 
0

एक इसके अलावा करने के लिए क्या अन्य ने लिखा है, आप Django> 1.7 पर Django टेम्पलेट का उपयोग करना चाहते हैं, तो आप की तरह अपने settings.configure (...) खाके चर फोन और 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.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.template.loader import get_template 
t = get_template('a.html') 
t.render({'name': 5}) 

Django Error: No DjangoTemplates backend is configured

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

संबंधित मुद्दे