原因是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加载程序并使用自省或传递应用程序信息,这变得有些复杂。一个更简单的解决方案:
举一个更具体的例子:
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())
___。split(“。”)[-2]假定文件在软件包中,因此它将例如’app1.views’转换为’app1’以添加为模板名称。这还假设用户在不重命名模板目录中的文件夹的情况下将永远不会重命名你的应用程序,这可能不是一个安全的假设,在这种情况下,只需将模板目录中的文件夹名称硬编码即可。