首页 > 解决方案 > 如何在 django-CMS 之外使用占位符?

问题描述

我正在尝试在 django-cms 上实施有关如何在 CMS 之外使用占位符的文档

似乎可以在 CMS 外部的模型应用程序中定义一个字段,其行为类似于djangocms-text-ckeditor

但我无法让这个“模板标签”工作

{% extends 'base.html' %}
{% load cms_tags %}

{% block content %}
    <h1>Title page info</h1>
    {% render_placeholder object.short_text "640" %}
{% endblock content %}

这是我的 info.models.py

from django.db import models
from cms.models.fields import PlaceholderField

class MsgDet(models.Model):
    title = models.CharField(max_length=255)
    short_text = PlaceholderField('content')

我使用django CMS 安装程序在 django-cms 教程之后创建了一个小型 django-cms 项目。源代码在 GitHub 上的OpenHBP/PlaceholderField下。我向 cms 添加了一个简单的信息应用程序,并尝试在“CKEditor like”插件中显示“MsgDet.short_text”字段。

双击 CMS 主页会打开 CKeditor 窗口。我想在我的信息页面上获得相同的结果!

我知道这可以通过使用ckeditor的RichTextField来实现,但我想使用“PlaceHolderFiled”来访问 djangoCMS 插件:图片/图像或文件。

请注意,我也尝试过使用django-ckeditor-filebrowser-filer但该项目似乎已被弃用并且 pdf 上传不起作用。

我只想能够从“CKEditor like”窗口访问文件管理器文件(图像和文档)......

标签: djangopluginsckeditordjango-cms

解决方案


现在可以了!

我已经添加了一个CMS_PLACEHOLDER_CONF字典,settings.py其中包含一个包含默认文本的特定“msgdet_slot”,'Lorem ipsum dolor sit amet...'以便当连接到 CMS 并且当页面处于修改状态时它在页面上可见:?edit 在 URL 的末尾

CMS_PLACEHOLDER_CONF = {
    None: {
        "plugins": ['TextPlugin'],
        'excluded_plugins': ['InheritPlugin'],
    },
    'msgdet_slot': {
        'plugins': ['TextPlugin', 'PicturePlugin', 'FilePlugin'],
        'text_only_plugins': ['LinkPlugin'],
        'extra_context': {"width":640},
        'name': "My slot",
        'language_fallback': True,
        'default_plugins': [
            {
                'plugin_type': 'TextPlugin',
                'values': {
                    'body':'<p>Lorem ipsum dolor sit amet...</p>',
                },
            },
        ],
        'child_classes': {
            'TextPlugin': ['PicturePlugin', 'FilePlugin'],
        },
        'parent_classes': {
            'LinkPlugin': ['TextPlugin'],
        },
    },
}

models.py因此必须修改

from django.db import models
from cms.models.fields import PlaceholderField

class MsgDet(models.Model):
    title = models.CharField(max_length=255)
    short_text = PlaceholderField('msgdet_slot')

最好使用您自己的插槽而不是 CMS 使用的通用“内容”,以便您可以修改要显示的 CMS 插件。在我的示例中,我只显示图片和文件插件。

另请注意,如果某些页面已使用名为“myslot”的插槽进行编辑,并且您将其更改为“msgdet_slot”,则旧页面的配置(可见 CMS 插件)将保留为“myslot”。File PlaceHolder 确实以唯一的 PK 存储在“cms_placeholder”表中。


推荐阅读