一尘不染

Django视图-首先从调用应用程序的目录加载模板

django

我尝试在HTML模板上保持某种一致的命名方案。即index.html代表主页面,delete.html代表删除页面,依此类推。但是,app_directories加载程序似乎总是从按字母顺序排列的第一个应用程序加载模板。

有什么办法可以始终始终在调用应用程序的templates目录中首先检查匹配项?

我的相关设置settings.py

PROJECT_PATH = os.path.realpath(os.path.dirname(__file__))

TEMPLATE_LOADERS = (
    'django.template.loaders.app_directories.load_template_source',
    'django.template.loaders.filesystem.load_template_source',
)
TEMPLATE_DIRS = (
    os.path.join(PROJECT_PATH, 'templates'),
)

我尝试更改的顺序TEMPLATE_LOADERS,但未成功。

根据Ashok的要求进行编辑:

每个应用程序的目录结构:

templates/
    index.html
    add.html
    delete.html
    create.html
models.py
test.py
admin.py
views.py

在每个应用程序的views.py中:

def index(request):
    # code...
    return render_to_response('index.html', locals())

def add(request):
    # code...
    return render_to_response('add.html', locals())

def delete(request):
    # code...
    return render_to_response('delete.html', locals())

def update(request):
    # code...
    return render_to_response('update.html', locals())

阅读 299

收藏
2020-04-02

共1个答案

一尘不染

原因是app_directories加载程序与将每个应用程序的模板文件夹添加到TEMPLATE_DIRS设置基本相同,例如

TEMPLATE_DIRS = (
    os.path.join(PROJECT_PATH, 'app1', 'templates'),
    os.path.join(PROJECT_PATH, 'app2', 'template'),
    ...
    os.path.join(PROJECT_PATH, 'templates'),
)

问题是,正如你提到的,index.html将始终在app1 / templates / index.html中找到,而不是其他任何应用程序。没有简单的方法可以魔术地解决此问题,而无需修改app_directories加载程序并使用自省或传递应用程序信息,这变得有些复杂。一个更简单的解决方案:

  • 保持你的settings.py原样
  • 在每个应用程序的模板文件夹中添加带有该应用程序名称的子目录
  • 在“ app1 / index.html”或“ app2 / index.html”等视图中使用模板

举一个更具体的例子:

project
    app1
        templates
            app1
                index.html
                add.html
                ...
        models.py
        views.py
        ...
    app2
        ...

然后在视图中:

def index(request):
    return render_to_response('app1/index.html', locals())

你甚至可以编写包装器来自动在所有视图之前添加应用程序名称,甚至可以扩展为使用自省功能,例如:

def render(template, data=None):
    return render_to_response(__name__.split(".")[-2] + '/' + template, data)

def index(request):
    return render('index.html', locals())

_ name ___。split(“。”)[-2]假定文件在软件包中,因此它将例如’app1.views’转换为’app1’以添加为模板名称。这还假设用户在不重命名模板目录中的文件夹的情况下将永远不会重命名你的应用程序,这可能不是一个安全的假设,在这种情况下,只需将模板目录中的文件夹名称硬编码即可。

2020-04-02