Skip to main content
 首页 » 编程设计

python之如何不可知论地链接来自另一个 Django 模型的任何对象/模型

2025年05月04日38www_RR

我正在编写一个基于 Django 的简单 CMS。大多数内容管理系统依赖于固定页面、固定 URL、使用具有一个或多个可编辑区域的模板。要拥有可编辑区域,您需要一个页面。为了让系统确定哪个页面,您需要 URL。

当您不再处理“页面”(可以是那些 FlatPages 页面或其他页面),而是来自另一个模型的实例时,问题就来了。例如,如果我有一个产品模型,我可能希望创建一个包含多个可编辑区域的详细信息页面。

我可以将这些区域构建到模型中,但在我的例子中,有多个模型并且我想要显示的数据量有很大差异。

因此,我想在模板级别构建 CMS,并根据“页面”实例或其使用的模型指定 block (可编辑区域)是什么。

我有一个想法,也许我可以像这样在页面上转储自定义模板标签:

{% block unique_object "unique placeholder name" %} 

这会根据传入的两个参数找到一个“ block ”。一个例子:

<h1>{{ product_instance.name }}</h1> 
{% block product_instance "detail: product short description" %} 
{% block product_instance "detail: product video" %} 
{% block product_instance "detail: product long description" %} 

听起来不错,对吧?那么我遇到的问题是如何为区域创建一个“ key ”以便我可以拉出正确的 block ?我将处理一个完全未知的对象(它可以是一个“页面”对象、一个 URL、一个模型实例,任何东西 - 它甚至可以是一艘船 </fg>)。

其他 Django 微应用程序必须这样做。你可以用 django-tagging 标记任何东西,对吧?我试图了解它是如何工作的,但我在画空白。

那么,首先,我疯了吗?假设我没有,而且这看起来是一个相对明智的想法,我应该如何将对象+字符串链接到 block /可编辑区域?

注意:编辑将在页面上完成,因此让用户编辑区域没有实际问题。我不必在管理员中做任何反向胡言乱语。我最终的梦想是允许第三个参数指定这是什么类型的内容区域(文本、图像、视频等)。如果您对此有任何意见,我很乐意阅读!

请您参考如下方法:

django-tagging 使用 Django 的 contenttypes框架。文档比我更好地解释了它,但最简单的描述是“可以指向任何其他模型的通用外键”。

这可能是您正在寻找的东西,但从您的描述来看,您还想做一些与其他一些现有项目非常相似的事情:

  • django-flatblocks (“...行为类似于 django.contrib.flatpages,但用于页面的某些部分;就像您希望与主要内容一起显示的可编辑帮助框。”)

  • django-better-chunks (“将其视为您可能希望插入到模板中并从管理界面管理的少量可重用内容的平面页面。”)

等等。如果它们相似,那么它们将为您提供一个很好的起点。