我是Django的新手,并且对如何最好地集成第三方应用程序感到相当困惑。在我(可能是天真的)对DRY的解释中,我想最小化复制/粘贴不仅是我自己的代码而且还有其他人的代码,所以我很高兴,例如,使用contrib.auth的模式主要是黑色如果我需要有关auth.User的其他信息(通过使用UserProfile对象或继承扩展auth.User)。这就是我想象的我也会使用大多数第三方应用程序。
然而,我很快发现这非常困难,所以现在我已经辞职了,我的所有第三方应用程序的“副本”都存放在我的项目文件夹中,这些应用程序基本上是完整副本,只需要很少的更改。最后一根稻草是我想要添加一个基本的博客(我选择了django-basic-blog)并且需要更改单个模板,而且我认为没有比在我的项目中使用该应用程序复制该应用程序更好的解决方案了。单个模板已更改。
我的问题:
答案 0 :(得分:5)
您不应该修改第三方模块的代码,因为很难跟踪更改,并且会将复制到许多项目中的相同代码弄得一团糟。典型的解决方案是在python路径中只有每个第三方模块的一个版本,而不是在项目的目录中。然后,所有项目都可以重用这个单一的包。
然而,模板需要不同的方法,因为它们通常需要在每个项目的基础上进行修改。这就是为什么Django附带settings.TEMPLATE_DIRS
和settings.TEMPLATE_LOADERS
。
TEMPLATE_DIRS
指定包含模板文件的目录列表。 TEMPLATE_LOADERS
指定用于加载模板的类。将按照定义的顺序使用加载器,并且将按照定义的顺序遍历目录。因此,您可以先在项目目录中查找模板,然后在其他模块中查找模板作为后备。
所以基本上你不需要复制整个python模块来改变一个模板。只复制该第三方模块的模板目录,甚至只复制您想要更改的单个模板。如果你放在正确的位置并添加TEMPLATE_DIR
中的路径,Django将使用它。