集成第三方应用程序的Django和模板

问题描述:

我是新来的Django和相当困惑的第三方应用程序是如何最好的集成。在我对DRY的(可能是天真的)解释中,我想尽量减少复制/粘贴不仅我自己的代码而且其他人的代码,所以我很满意,例如,使用contrib.auth的模式主要是黑色如果我需要auth.User的附加信息(通过用UserProfile对象或继承来扩展auth.User)。这就是我想象的,我也会使用大多数第三方应用程序。集成第三方应用程序的Django和模板

不过,我很快就发现,这是很困难的,所以现在我已经辞职,让所有我的生活我的项目文件夹内的第三方应用程序,基本上都是以最小的变化整个副本的“副本”。最后一根稻草是我想添加一个基本的博客(我在django-basic-blog上定过的),并且只需要更改一个模板,并且我想没有比在项目中使用该应用程序副本更好的解决方案单个模板已更改。

我的问题:

    在我需要改变只是一个单一的模板,这种特定的情况下
  • ,就是这个(复制整个应用程序在)我能做到的最好?如果我只需要改变单一的模式,我可以保持第三方应用恭敬地完整,在我自己的应用程序做一个模型继承...一般
  • ,这种做法我的项目下复制应用程序和修补每一个的一点点感觉疯狂浪费和肮脏。这也感觉,如果我使用的是经常更新的第三方应用程序,同步更改将会很麻烦。我应该只是学会爱炸弹,还是有一些明显的架构模式/ Django提供的帮助,我错过了?

您不应该修改第三方模块的代码,因为它很难跟踪更改,并且会将相同的代码复制到许多项目中,导致混乱。典型的解决方案是在你的Python路径中只有一个第三方模块的版本,而不是在你的项目的目录中。这个单一的软件包可以被你的所有项目重复使用。需要对模板

但是不同的方法,因为他们经常需要在每个项目的基础上进行修改。这就是为什么Django自带settings.TEMPLATE_DIRSsettings.TEMPLATE_LOADERS

TEMPLATE_DIRS指定包含模板文件的目录列表。 TEMPLATE_LOADERS指定用于加载模板的类。装载程序将按照它们的定义使用,并且目录将按照它们的定义进行遍历。因此,您可以首先在项目目录中查找模板,并在其他模块中查找模板作为后备。

所以基本上你不需要整个Python模块复制,以改变一个模板。只需复制第三方模块的模板目录,甚至只需复制要更改的单个模板即可。如果你将放在正确的地方,并添加路径在TEMPLATE_DIR Django将使用它。

+0

啊。谢谢。这完全回答了我的第一个问题。 – yanzhang 2012-02-25 17:59:18

+0

另外,从您的回应中,您似乎暗示几乎总是有一种方法来使用第三方模块而不明确更改其代码。现在让我尝试猜测你已经教给我关于模板的事情:对于每个第三方应用程序“TheirApp”来说,我应该创建一个“MyApp”目录,在这里我可以从TheirApp导入/扩展模型和视图,创建/模板(并确保TEMPLATE_LOADERS中的排序是正确的),并将这两个应用程序和MyApp添加到设置中。这是正确的模式吗? – yanzhang 2012-02-25 18:03:21

+0

在你的项目中,你通常有'/ templates'目录,你的模板在哪里。也放置第三方模板。 – 2012-02-25 18:06:57