سؤال

أرغب في استخدام محرك قالب 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.
هل كانت مفيدة؟

المحلول

الحل بسيط.انها في الواقع وثق بشكل جيد, ، ولكن ليس من السهل العثور عليه.(اضطررت إلى البحث - ولم يظهر ذلك عندما حاولت إجراء بعض عمليات البحث المختلفة على 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 (المرتبطة أعلاه) للحصول على وصف لبعض الإعدادات التي قد ترغب في تحديدها (كوسائط للكلمات الرئيسية لتكوينها).

نصائح أخرى

جينجا2 بناء الجملة يشبه إلى حد كبير محرك 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'

هل هناك سبب محدد لرغبتك في استخدام قوالب Django؟كلاهما جينجا و جينشي هي، في رأيي، متفوقة.


إذا كنت تريد ذلك حقًا، فراجع وثائق جانغو على settings.py.وخاصة قسم "استخدام الإعدادات بدون إعداد DJANGO_SETTINGS_MODULE".استخدم شيئًا مثل هذا:

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

أود أيضًا أن أوصي بـ jinja2.هناك مقال جميل على django ضد. jinja2 يقدم بعض المعلومات التفصيلية حول سبب تفضيلك للخيار الأحدث.

وفقًا لوثائق جينجا، لا يزال دعم Python 3 تجريبيًا.لذا، إذا كنت تستخدم Python 3 ولم يكن الأداء يمثل مشكلة، فيمكنك استخدام محرك القالب المدمج في 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"

أود أن أقول جينجا أيضًا.إنه بالتأكيد اقوى من محرك جانغو Templating وهو كذلك تقف وحدها.

إذا كان هذا مكونًا خارجيًا لتطبيق Django موجود، فيمكنك إنشاؤه أمر مخصص واستخدم محرك القوالب داخل بيئة مشاريعك.مثله؛

manage.py generatereports --format=html

لكنني لا أعتقد أن الأمر يستحق استخدام محرك Django Templating بدلاً من Jinja.

شركا للمساعدة شباب.هنا إضافة أخرى.الحالة التي تحتاج فيها إلى استخدام علامات القالب المخصصة.

لنفترض أن لديك علامة القالب المهمة هذه في الوحدة 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}

لا.يستخدم StringTemplate بدلاً من ذلك--ليس هناك سبب للتفكير في استخدام أي محرك قوالب آخر بمجرد معرفتك به.

إضافة إلى ما كتبه الآخرون، إذا كنت تريد استخدام قالب 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

وأكرر التصريحات المذكورة أعلاه.Jinja 2 عبارة عن مجموعة شاملة جيدة جدًا من قوالب Django للاستخدام العام.أعتقد أنهم يعملون على جعل قوالب Django أقل اقترانًا بالإعدادات.py، ولكن من المفترض أن يقوم Jinja بعمل جيد بالنسبة لك.

أثناء تشغيل manage.py صدَفَة:

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

جوجل AppEngine يستخدم محرك القوالب Django، هل ألقيت نظرة على كيفية القيام بذلك؟ربما يمكنك فقط استخدام ذلك.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top