首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何在Django中使用另一个模板引擎

如何在Django中使用另一个模板引擎
EN

Stack Overflow用户
提问于 2021-07-05 17:04:01
回答 1查看 144关注 0票数 1

我希望创建一个引擎,稍后我将在使用模板实例时使用该引擎。

我不想在设置中定义它,因为它中定义的逻辑不应该分布在任何地方,而只是在特定的情况下。

我所做的是:

代码语言:javascript
复制
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继承,而是从引擎继承有什么问题吗?如果是,请提出建议。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2021-07-05 17:42:05

不需要仅仅为了从其他地方加载模板而重写模板引擎。相反,您所需要的只是一个自定义装载机。下面是一些可能适合您需要的加载程序示例代码:

代码语言:javascript
复制
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设置中以使用它:

代码语言:javascript
复制
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的包已经这样做了,它可能比这里的这个基本实现更高效。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/68259782

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档