Bagaimana saya menggunakan cetakan Django tanpa sisa Django?


101

Saya ingin menggunakan mesin cetakan Django dalam kode (Python) saya, tetapi saya tidak sedang membangun situs web berbasis Django. Bagaimana cara saya menggunakannya tanpa memiliki file settings.py (dan lainnya) dan harus mengatur variabel lingkungan DJANGO_SETTINGS_MODULE?

Jika saya menjalankan kode berikut:

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

Saya mendapat:

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

Jawaban:


133

Solusinya sederhana. Ini sebenarnya terdokumentasi dengan baik , tetapi tidak terlalu mudah ditemukan. (Saya harus mencari-cari - itu tidak muncul ketika saya mencoba beberapa pencarian Google yang berbeda.)

Kode berikut berfungsi:

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

Lihat dokumentasi Django (ditautkan di atas) untuk penjelasan dari beberapa pengaturan yang mungkin ingin Anda definisikan (sebagai argumen kata kunci untuk dikonfigurasi).


13
Dan untuk mendapatkannya dari file: settings.configure (TEMPLATE_DIRS = (".",)) T = get_template ('test.html')
Bryce

Dokumentasi untuk settings.configure () ada di sini - docs.djangoproject.com/en/1.7/topics/settings
Scott

Dari tautan "terdokumentasi dengan baik" di atas, ini berlaku hingga versi 1.7. Mulai dari 1.8, sepertinya Anda tidak perlu settings.configure()lagi.
Olaf Dietsche

Jika Anda ingin menyertakan template lain, atau menggunakan template inheritance, solusi di atas oleh Bryce diperlukan.
titusjan

6
Saya juga perlu memanggil django.setup () sebelum konstruktor Template.
Amit

44

Sintaks Jinja2 hampir sama dengan Django dengan sedikit perbedaan, dan Anda mendapatkan mesin templat yang jauh lebih hebat, yang juga mengkompilasi templat Anda ke bytecode (CEPAT!).

Saya menggunakannya untuk membuat template, termasuk di Django itu sendiri, dan itu sangat bagus. Anda juga dapat dengan mudah menulis ekstensi jika beberapa fitur yang Anda inginkan hilang.

Berikut adalah beberapa demonstrasi pembuatan kode:

>>> 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
Saya menggunakan Jinja dalam proyek saya, karena saya menginginkan sesuatu yang cukup saya kenal, tetapi tidak ingin pengguna saya (karena ini adalah aplikasi yang dapat didistribusikan) harus memasang Django. Nilai tambahnya adalah Jinja dapat diinstal dengan easy_install.
Xiong Chiamiov

4
Django dapat diinstal dengan easy_install juga.
hegemon

Jinga belum secara resmi mendukung Python3. Menurut situs tersebut, Ini masih eksperimental.
Pramod

9

Adakah alasan khusus Anda ingin menggunakan cetakan Django? Baik Jinja dan Genshi , menurut saya, lebih unggul.


Jika Anda benar-benar menginginkannya, lihat dokumentasi Django disettings.py . Terutama bagian "Menggunakan pengaturan tanpa pengaturan DJANGO_SETTINGS_MODULE". Gunakan sesuatu seperti ini:

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

7

Saya juga merekomendasikan jinja2. Ada artikel bagus tentang djangovs. jinja2yang memberikan beberapa informasi rinci tentang mengapa Anda harus memilih nanti.


Saya lebih suka Jinja2 karena {% set %}sintaks dan persamaannya dengan mesin template Twig (PHP). Lebih baik menulis kode lintas platform selalu, tetapi perbedaan kinerja tidak terlalu penting - misalnya, python akan selalu bekerja lebih lambat daripada PHP jadi jika Anda membutuhkan kinerja, Anda lebih baik membuat situs dengan PHP, Twig dan Symfony2 atau yang lain. Sedih tapi sebenarnya.
Croll

@Croll, Jika situs web Anda melakukan komputasi yang kompleks, maka pustaka python jauh lebih cepat, jika tidak, hambatannya adalah basis data atau Anda kemungkinan besar melakukan sesuatu yang salah
Bob

4

Menurut dokumentasi Jinja, dukungan Python 3 masih bersifat eksperimental . Jadi jika Anda menggunakan Python 3 dan kinerja tidak menjadi masalah, Anda dapat menggunakan mesin templat bawaan django.

Django 1.8 memperkenalkan dukungan untuk beberapa mesin cetakan yang membutuhkan perubahan cara templat diinisialisasi. Anda harus secara eksplisit mengkonfigurasi settings.DEBUGmana yang digunakan oleh mesin cetakan default yang disediakan oleh django. Berikut kode untuk menggunakan template tanpa menggunakan django lainnya.

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

Tambahan untuk apa yang ditulis lain, jika Anda ingin menggunakan Template Django pada Django> 1.7, Anda harus memberikan pengaturan Anda. Configure (...) panggil variabel TEMPLATES dan panggil django.setup () seperti ini:

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

Kemudian Anda dapat memuat template Anda seperti biasa, dari string:

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

Dan jika Anda menulis variabel DIRS di .configure, dari disk:

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

Kesalahan Django: Tidak ada backend DjangoTemplates yang dikonfigurasi

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


2

Saya akan mengatakan Jinja juga. Ini jelas lebih bertenaga daripada Mesin Templating Django dan berdiri sendiri .

Jika ini adalah steker eksternal ke aplikasi Django yang ada, Anda dapat membuat perintah kustom dan menggunakan mesin template dalam lingkungan proyek Anda. Seperti ini;

manage.py generatereports --format=html

Tapi saya rasa tidak ada gunanya hanya menggunakan Mesin Templating Django daripada Jinja.


2

Terima kasih atas bantuannya. Ini satu tambahan lagi. Kasus ketika Anda perlu menggunakan tag template kustom.

Misalkan Anda memiliki tag template penting ini di module read.py

from django import template

register = template.Library()

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

Ini adalah file template html "temp.html":

{{var|bracewrap}}

Terakhir, berikut adalah skrip Python yang akan mengikat semuanya

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)

Hasilnya adalah

{stackoverflow.com rox}

django.template.base.add_to_builtins("read")menimbulkan ValueErroruntuk saya.
oarfish

memberikan TemplateDoesNotExistkesalahan Saya menggunakan django 1.10.1
Vikrant Singh



0

Saya menggemakan pernyataan di atas. Jinja 2 adalah superset dari templat Django yang cukup bagus untuk penggunaan umum. Saya pikir mereka sedang bekerja untuk membuat cetakan Django sedikit lebih sedikit digabungkan dengan settings.py, tetapi Jinja harus melakukannya dengan baik untuk Anda.


0

Saat menjalankan manage.pyshell:

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

0

Google AppEnginemenggunakan mesin template Django, pernahkah Anda melihat bagaimana mereka melakukannya? Anda mungkin bisa menggunakan itu.

Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.