2016-01-17 42 views
0

我最近开始学习Django(版本1.9),并且有一个关于templates inheritance的问题。扩展应用程序模板时的最佳做法是什么?

假设我有一个名为mysite的Django项目和一个名为myapp的应用程序。
而我创建的基本模板名为base.html,另一个名为child.html,它继承base.html

所以目录结构是这样的:

(project root) 
├── mysite 
│   ├── settings.py 
│   ├── urls.py 
│   └── ... 
├── myapp 
│   ├── models.py 
│   ├── views.py 
│   ├── ... 
│   └── templates 
│    └── myapp 
│    ├── base.html 
│    └── child.html 
└── manage.py 

在这种情况下,我可以继承base.html这样。

<!-- on top of `child.html` --> 
{% extends "myapp/base.html" %} 

我想知道的是,我硬编码的应用程序名称。
是否有其他避免硬编码应用程序名称的写法?
或者,没关系,我不需要担心?


我想出了一些解决方法。

1)将base.html直属templates目录

├── myapp 
│   ├── models.py 
│   ├── views.py 
│   ├── ... 
│   └── templates 
│    ├── base.html # Here! 
│    └── myapp 
│    └── child.html 

- >我认为它会导致文件名的应用程序之间崩溃。

2)项目templates目录下放置base.html
- >在这种情况下,我不希望在应用程序之间共享base.html
base.html这里只对myapp,没有其他应用程序)

回答

0

您的基本模板和您的子模板都是特定于您的应用程序的,所以它们都应该位于同一myapp/子目录中。硬编码对myapp/base.html的依赖是完全可以接受的。

+0

谢谢@knbk。最后,我认为这是可以接受的,因为我们还必须在'views.py'中的'template_name'中对应用程序名称进行硬编码。对? –

0

如何

|── myapp 
│ ├── models.py 
│ ├── views.py 
│ ├── ... 
│ └── templates 
│  ├── base.html # Here! 
│  └── child.html 
│   

然后用

<!-- on top of `child.html` --> 
{% extends "base.html" %} 

然后在每个views.py的开始动态更改模板目录文件。

from django.conf import settings 
settings.TEMPLATE_DIRS =(os.path.join(settings.BASE_DIR,'myapp/templates').replace('\\','/'),) 

您必须对每个应用程序都做同样的事情。

+1

非常感谢您的回答。但我认为这不是推荐的方式。因为如果在不同的应用程序中有另一个'base.html',Django无法区分它们。 (根据https://docs.djangoproject.com/en/1.9/intro/tutorial03/,“Template namespacing”admoition) –

+0

如何动态更改每个views.py文件开始处的Template目录你的应用。 '从django.conf导入设置'。然后执行'settings.TEMPLATE_DIRS =(os.path.join(settings.BASE_DIR,'path/to/this/app/templates')。替换('\\','/'),)' – CuriousGeorge

+0

哦,我没有想出这样的想法。我认为,谢谢 –

相关问题