Django模板系统独立

时间:2015-01-24 08:16:10

标签: django templates django-templates django-settings

我正在尝试使用Django模板系统作为python脚本中的工具来输出文件。我不需要Django框架的其他组件。

我按照configure the template system for standalone mode的说明操作,但当我尝试使用template.loader.render_to_string()template.loader.get_template()template.render(Content())时,我收到了AppRegistryNotReady例外情况:< / p>

    raise AppRegistryNotReady("Apps aren't loaded yet.")
django.core.exceptions.AppRegistryNotReady: Apps aren't loaded yet.

我按照文档中的描述进行了以下settings.configure()调用:

settings.configure(
    DEBUG=DEBUG,
    TEMPLATE_DEBUG=True,
    TEMPLATE_DIRS=(
        POSTS_DIR,
        TEMPLATES_DIR,
        PAGES_DIR,
    ),
)

我尝试添加INSTALLED_APPS=()同样的问题。我只是想使用模板系统。除了模板加载器之外我什么都不需要,所以我可以extend模板。

3 个答案:

答案 0 :(得分:3)

我怀疑此错误是从django.template.loaders.app_directories.Loader引发的。尝试添加TEMPLATE_LOADERS设置:

settings.configure(
    DEBUG=DEBUG,
    TEMPLATE_DEBUG=True,
    TEMPLATE_DIRS=(
        POSTS_DIR,
        TEMPLATES_DIR,
        PAGES_DIR,
    ),
    TEMPLATE_LOADERS=('django.template.loaders.filesystem.Loader',),
)

答案 1 :(得分:2)

对于那些从django 1.10来到这里的人,和我一样,想要使用unittest测试Django模板语言,你需要使用引擎类。

ubuntu@ubuntu-xenial:~/src$ python3
Python 3.5.2 (default, Sep 10 2016, 08:21:44) 
[GCC 5.4.0 20160609] on linux
Type "help", "copyright", "credits" or "license" for more information.
.>>> from django.template import Engine, Context
.>>> _template = Engine().from_string('my name {{ name }}')
.>>> _context = Context({'name':'Claudio Santos'})
.>>> _template.render(_context)
'my name Claudio Santos'

Refences:

Upgrading Django 1.8

The Engine Class

Using Settings without DJANGO_SETTINGS_MODULE

答案 2 :(得分:0)

如果您的代码是真正独立的代码,则必须调用django.setup()

import os
import django
from django.conf import settings
from django.template.loader import render_to_string

settings.configure(
    TEMPLATES=[{
        'BACKEND': 'django.template.backends.django.DjangoTemplates',
        'DIRS': [os.path.dirname(os.path.realpath(__file__))],  # script dir
    }]
)
django.setup()

message = render_to_string(
    'mail_template.html',
    {'variable1337': 1337}
)
print(message)

此外,TEMPLATE_DIRS也已弃用。当前接受的答案不再正确。