我尝试在HTML模板上保持某种一致的命名方案。即index.html代表主页面,delete.html代表删除页面,依此类推。但是,app_directories加载程序似乎总是从按字母顺序排列的第一个应用程序加载模板。
delete.html
app_directories
有什么办法可以始终始终在调用应用程序的templates目录中首先检查匹配项?
templates
我的相关设置settings.py:
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())
原因是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())
_ name ___。split(“。”)[-2]假定文件在软件包中,因此它将例如’app1.views’转换为’app1’以添加为模板名称。这还假设用户在不重命名模板目录中的文件夹的情况下将永远不会重命名你的应用程序,这可能不是一个安全的假设,在这种情况下,只需将模板目录中的文件夹名称硬编码即可。