我希望创建一个引擎,稍后我将在使用模板实例时使用该引擎。
我不想在设置中定义它,因为它中定义的逻辑不应该分布在任何地方,而只是在特定的情况下。
我所做的是:
from django.template.engine import Engine
class ModelEngine(Engine):
def find_template(self, name, dirs=None, skip=None):
# some another logic to get a template instance
...
engine = ModelEngine()
# Usage
template_code = "{% include \"some_template.html\" %}"
Template(template_code, engine=engine).render(Context())这个解决方案正确吗?不是从BaseEngine继承,而是从引擎继承有什么问题吗?如果是,请提出建议。
发布于 2021-07-05 17:42:05
不需要仅仅为了从其他地方加载模板而重写模板引擎。相反,您所需要的只是一个自定义装载机。下面是一些可能适合您需要的加载程序示例代码:
from django.template import Origin, TemplateDoesNotExist
from django.template.loaders.base import Loader
class DBLoader(Loader):
def get_template_sources(self, template_name):
yield Origin(
name=template_name,
template_name=template_name,
loader=self,
)
def get_contents(self, origin):
try:
# Assuming name of your model and field that has template name
instance = YourTemplateModel.objects.get(template_name=origin.template_name)
return instance.content
except (YourTemplateModel.MultipleObjectsReturned, YourTemplateModel.DoesNotExist):
raise TemplateDoesNotExist(template_name)接下来,您可以简单地将此加载程序添加到TEMPLATES设置中以使用它:
TEMPLATES = [
{
'BACKEND': 'django.template.backends.django.DjangoTemplates',
'DIRS': [BASE_DIR / 'templates']
,
'APP_DIRS': True,
'OPTIONS': {
'context_processors': [
'django.template.context_processors.debug',
'django.template.context_processors.request',
'django.contrib.auth.context_processors.auth',
'django.contrib.messages.context_processors.messages',
],
'loaders': [
'django.template.loaders.filesystem.Loader',
'django.template.loaders.app_directories.Loader',
'path.to.DBLoader',
],
},
},
]请注意,还有一个名为django-dbtemplates的包已经这样做了,它可能比这里的这个基本实现更高效。
https://stackoverflow.com/questions/68259782
复制相似问题