Django 模板系统独立
Django template system standalone
我正在尝试使用 Django 模板系统作为 python 脚本中的工具来输出文件。我不需要 Django 框架的其他组件。
我按照 configure the template system for standalone mode 的说明操作,但是当我尝试使用 template.loader.render_to_string()
、template.loader.get_template()
或 template.render(Content())
时,我返回了 AppRegistryNotReady
异常:
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
个模板。
我怀疑这个错误是 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',),
)
对于那些从 django 1.10 来到这里的人,和我一样,想用 unittest 测试 Django 模板语言,你需要使用引擎 Class。
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'
参考文献:
如果您的代码是真正独立的,则必须调用 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
已弃用。当前接受的答案不再正确。
我正在尝试使用 Django 模板系统作为 python 脚本中的工具来输出文件。我不需要 Django 框架的其他组件。
我按照 configure the template system for standalone mode 的说明操作,但是当我尝试使用 template.loader.render_to_string()
、template.loader.get_template()
或 template.render(Content())
时,我返回了 AppRegistryNotReady
异常:
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
个模板。
我怀疑这个错误是 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',),
)
对于那些从 django 1.10 来到这里的人,和我一样,想用 unittest 测试 Django 模板语言,你需要使用引擎 Class。
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'
参考文献:
如果您的代码是真正独立的,则必须调用 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
已弃用。当前接受的答案不再正确。