如何将任何对象/模型与另一个Django模型无关地链接?

Oli*_*Oli 1 python django django-models content-management-system

我正在编写一个基于Django的简单CMS.大多数内容管理系统依赖于使用具有一个或多个可编辑区域的模板在固定URL上具有固定页面.要拥有可编辑区域,您需要一个Page.要使系统计算出哪个页面,您需要URL.

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

可以将这些区域构建到模型中,但在我的情况下,有几个模型,并且在我想要显示的数据量方面有很多差异.

因此,我想在模板级别构建CMS,并根据"页面"实例或它使用的模型指定块(可编辑区域)的内容.

我有一个想法,也许我可以在页面上转储自定义模板标签,如下所示:

{% block unique_object "unique placeholder name" %}
Run Code Online (Sandbox Code Playgroud)

这将根据传入的两个参数找到一个"块".例如:

<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" %}
Run Code Online (Sandbox Code Playgroud)

听起来很漂亮,对吧?我遇到的问题是如何为区域创建一个"密钥",以便我可以拉出正确的块?我将处理一个完全未知的对象(它可能是一个"页面"对象,一个URL,一个模型实例,任何东西 - 它甚至可能是一条船</fg>).

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

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

注意:编辑将在页面上完成,因此让用户编辑区域没有实际问题.我不需要在管理员中做任何反向误导.我最终的梦想是允许第三个参数指定这是什么类型的内容区域(文本,图像,视频等).如果您对此有任何意见,我很高兴看到它们!

Van*_*ale 6

django-tagging使用Django的contenttypes框架.文档在解释它方面做得比我能做得好得多,但最简单的描述就是"可以指向任何其他模型的通用外键".

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

  • django-flatblocks("......就像django.contrib.flatpages一样,但对于页面的某些部分;就像你想要在主要内容旁边显示的可编辑帮助框一样.")

  • django-better-chunks("将其视为可重复使用的内容的小页面,您可能希望将其插入模板并从管理界面进行管理.")

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