Django CMS 项目中的占位符(Placeholder)使用指南

Django CMS 项目中的占位符(Placeholder)使用指南

django-cms django-cms/django-cms: 是一个基于 Django 的内容管理系统,可以用于构建多语言的 Web 应用程序和网站,提供了丰富的内容管理功能和多种插件扩展。 django-cms 项目地址: https://gitcode.com/gh_mirrors/dj/django-cms

什么是占位符

在Django CMS中,占位符(Placeholder)是一种特殊的模型字段,用于在模板中渲染用户可编辑的内容(插件)。简单来说,它就像一个容器,用户可以通过前端编辑器向网页添加文本、视频等各种插件内容。

占位符的核心概念

占位符本质上是一个用于存放CMSPlugin实例的容器,它不仅可以用于CMS页面,还可以在自定义应用中使用。通过PlaceholderRelationField,开发者可以在自定义模型上利用CMS插件的全部功能。

新旧版本差异

在Django CMS 4.0版本中,占位符系统有了重要改进:

  1. 工具栏现在为包含占位符的Django模型提供了预览和编辑端点
  2. 即使模型没有面向用户的视图(如django CMS Alias),也可以包含占位符
  3. 需要将前端可编辑模型注册到django CMS
  4. 视图需要告知工具栏它们是否包含前端可编辑模型

注意:Django CMS 3.x使用不同的方式集成占位符,旧版的PlaceholderField("slot_name")需要改为4.x版本中的PlaceholderRelationField

基础使用教程

1. 定义模型

首先需要在模型中定义PlaceholderRelationField:

from django.db import models
from django.utils.functional import cached_property
from cms.models.fields import PlaceholderRelationField
from cms.utils.placeholder import get_placeholder_from_slot

class MyModel(models.Model):
    placeholders = PlaceholderRelationField()

    @cached_property
    def my_placeholder(self):
        return get_placeholder_from_slot(self.placeholders, "slot_name")

2. 模板渲染

在模板中使用render_placeholder标签渲染占位符:

{% load cms_tags %}

{% render_placeholder mymodel_instance.my_placeholder "640" %}

render_placeholder标签参数说明:

  • PlaceholderField实例
  • 可选width参数,用于上下文相关插件
  • 可选language参数,指定渲染语言

3. 视图配置

视图需要返回request对象,并为工具栏设置对象:

from django.shortcuts import get_object_or_404, render

def render_my_model(request, obj):
    return render(
        request,
        "my_model_detail.html",
        {"object": obj},
    )

def my_model_detail(request, id):
    obj = get_object_or_404(MyModel, id=id)
    request.toolbar.set_object(obj)
    return render_my_model(request, obj)

高级功能

多语言支持

占位符和其中的插件原生支持多语言。如果还需要翻译其他字段,可以使用django-hvad:

class MultilingualExample1(TranslatableModel):
    translations = TranslatedFields(
        title=models.CharField('title', max_length=255),
        description=models.CharField('description', max_length=255),
    )
    placeholders = PlaceholderRelationField()

    @cached_property
    def my_placeholder(self):
        return get_placeholder_from_slot(self.placeholders, "slot_name")

结构模板

为了让前端编辑器知道模型包含哪些占位符,需要创建一个结构模板:

{% load cms_tags %}
{% placeholder "slot_name" %}

然后在模型中指定这个模板:

class MyModel(models.Model):
    def get_template(self):
        return "my_app/my_model_structure.html"

注册前端编辑

在应用的cms_config.py中注册模型:

from cms.app_base import CMSAppConfig
from . import models, views

class MyAppConfig(CMSAppConfig):
    cms_enabled = True
    cms_toolbar_enabled_models = [(models.MyModel, views.render_my_model)]

权限管理

用户必须满足以下条件才能编辑占位符:

  1. 是staff成员
  2. 拥有包含PlaceholderRelationField模型的编辑权限或该模型实例的权限

具体权限要求:

  • 添加:需要模型或实例的add或change权限
  • 修改:需要模型或实例的add或change权限
  • 删除:需要模型或实例的add、change或delete权限

可以通过自定义认证后端实现对象级权限控制。

最佳实践

  1. 对于现有模型,添加PlaceholderRelationField后需要保存实例才能在前端编辑器中看到占位符
  2. 使用cached_property优化占位符访问性能
  3. 在类视图中,可以在get_context_data方法中设置工具栏对象
  4. 结构模板只需包含占位符声明,不需要完整布局

通过以上方法,开发者可以充分利用Django CMS的占位符系统,在自定义应用中实现强大的内容编辑功能。

django-cms django-cms/django-cms: 是一个基于 Django 的内容管理系统,可以用于构建多语言的 Web 应用程序和网站,提供了丰富的内容管理功能和多种插件扩展。 django-cms 项目地址: https://gitcode.com/gh_mirrors/dj/django-cms

创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

宋海翌Daley

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值