在另一个应用程序中使用另一个Django应用程序的模板

问题描述:

我有两个Django应用程序。一个属于核心代码和一个贡献应用程序。我需要做的是在我的contrib应用程序中显示一个模板,该模板实际上已经存在于核心应用程序中。这是多还是少的文件夹结构:在另一个应用程序中使用另一个Django应用程序的模板

  • Django项目
    • 核心应用
      • 模板 ...
    • 的contrib应用
      • 模板 - template_fro m_core_app

模板呈现从视图和表单存在于核心应用数据。我想知道做这种事情的最佳方式是什么。

+2

这里不应该有任何问题:除了在文件目录中,模板不以任何方式“属于”应用程序。 –

是的,你可以做到这一点,利用include

core_app/ 
    templates/ 
     core_app/ 
      page1.html 
contrib_app/ 
    templates/ 
     contrib_app/ 
      page1.html 
      page2.html 

{% include "core_app/page1.html" %} or {% include "contrib_app/page1.html" %}

您也可以参考这个文件Template

+1

以避免名称冲突,这就是为什么在'模板'中使用相同的名称 – Sanket

给你使用render()的快捷方式在contrib.views,你只需从核心应用程序加载模板,并确保上下文var满足核心模板呈现的内容。如果你提供诸如“coreapp/template.html”的GET_CONTEXT路径()模板加载器后端会发现找到正确的模板给它设置正确:

settings.py: 设置APP_DIRS=TrueTEMPLATE字典。 Django将通过get_template()和select_template()函数在每个应用程序中查找模板。

contrib.views.py

from django.http import HttpResponse 
from django.template import loader 

def index(request): 
    ... 
    template = loader.get_template('coreapp/template.html') 
    context = { 
     'core_template_var': core_template_var, 
     ... 
    } 
    return HttpResponse(template.render(context, request)) 

推荐阅读:

渲染():https://docs.djangoproject.com/en/1.11/topics/http/shortcuts/#render

模板载入:https://docs.djangoproject.com/en/1.11/topics/templates/#template-loading

注意:您也可以使用备用模板用select_template()代替get_template()。 select_template()接受一个列表,并依次尝试每个模板路径,返回确实存在的第一个模板路径。