You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

django-cms 3.5下如何迁移废弃cmsplugin-filer插件至djangocms新插件?

Django-CMS 3.5+ 从cmsplugin-filer到djangocms-file/picture的迁移指南

我刚好处理过一模一样的迁移需求,给你一套稳扎稳打的步骤,确保现有插件数据完整保留,平稳过渡到官方推荐的新插件:

迁移前必做准备

  • 全量备份数据库:这是底线,不管操作多熟练,先备份!可以用pg_dump(PostgreSQL)、mysqldump(MySQL),或者Django的python manage.py dumpdata导出全量数据。
  • 安装新插件包:
    pip install djangocms-file djangocms-picture
    
  • 将新插件添加到settings.py的INSTALLED_APPS:
    INSTALLED_APPS = [
        # ... 其他已有的app
        'djangocms_file',
        'djangocms_picture',
    ]
    
  • 运行数据库迁移,创建新插件的表结构:
    python manage.py migrate
    

核心插件数据迁移

接下来要把旧插件的数据逐个迁移到新插件中,这里需要编写Django数据迁移脚本,直接手动改数据库风险太高,脚本迁移更安全。

1. FilerFile → djangocms-file

创建一个空的数据迁移文件(在你的主业务app下):

python manage.py makemigrations --empty your_main_app

然后编辑生成的迁移文件,添加以下逻辑:

from django.db import migrations
from cmsplugin_filer_file.models import FilerFile
from djangocms_file.models import File

def migrate_filer_file(apps, schema_editor):
    # 遍历所有旧的FilerFile实例
    for old_file in FilerFile.objects.all():
        # 创建新的djangocms-file实例,复制对应字段
        new_file = File.objects.create(
            cmsplugin_ptr=old_file.cmsplugin_ptr,
            file=old_file.file,
            label=old_file.label,
            title=old_file.title,
            description=old_file.description,
            download_filename=old_file.download_filename,
            # 其他字段根据实际使用情况对应复制
        )
        # 释放旧实例的cmsplugin_ptr关联,避免重复引用
        old_file.cmsplugin_ptr = None
        old_file.save()

class Migration(migrations.Migration):
    dependencies = [
        # 依赖djangocms_file的初始迁移,需替换为实际迁移编号
        ('djangocms_file', '0001_initial'),
        ('cmsplugin_filer_file', '0001_initial'),
        ('your_main_app', '之前的迁移编号'),
    ]

    operations = [
        migrations.RunPython(migrate_filer_file),
    ]

2. FilerFolder → djangocms-file-folder

类似上面的步骤,编写迁移脚本处理文件夹插件:

from django.db import migrations
from cmsplugin_filer_folder.models import FilerFolder
from djangocms_file.models import Folder

def migrate_filer_folder(apps, schema_editor):
    for old_folder in FilerFolder.objects.all():
        new_folder = Folder.objects.create(
            cmsplugin_ptr=old_folder.cmsplugin_ptr,
            folder=old_folder.folder,
            label=old_folder.label,
            title=old_folder.title,
            description=old_folder.description,
        )
        old_folder.cmsplugin_ptr = None
        old_folder.save()

class Migration(migrations.Migration):
    dependencies = [
        ('djangocms_file', '0002_folder'),
        ('cmsplugin_filer_folder', '0001_initial'),
        ('your_main_app', '之前的迁移编号'),
    ]

    operations = [
        migrations.RunPython(migrate_filer_folder),
    ]

3. FilerImage → djangocms-picture

编写图片插件的迁移脚本,注意字段对应关系:

from django.db import migrations
from cmsplugin_filer_image.models import FilerImage
from djangocms_picture.models import Picture

def migrate_filer_image(apps, schema_editor):
    for old_image in FilerImage.objects.all():
        new_picture = Picture.objects.create(
            cmsplugin_ptr=old_image.cmsplugin_ptr,
            image=old_image.image,
            alt=old_image.alt_text,
            caption=old_image.caption,
            width=old_image.width,
            height=old_image.height,
            alignment=old_image.alignment,
            link=old_image.link,
            link_target=old_image.link_target,
            # 其他字段按需复制
        )
        old_image.cmsplugin_ptr = None
        old_image.save()

class Migration(migrations.Migration):
    dependencies = [
        ('djangocms_picture', '0001_initial'),
        ('cmsplugin_filer_image', '0001_initial'),
        ('your_main_app', '之前的迁移编号'),
    ]

    operations = [
        migrations.RunPython(migrate_filer_image),
    ]

自定义FilerImage插件的迁移

如果你的项目里有继承自FilerImage的自定义插件,需要分两步处理:

1. 修改自定义插件的父类

把原来继承自FilerImage的代码:

from cmsplugin_filer_image.cms_plugins import FilerImagePlugin

class CustomImagePlugin(FilerImagePlugin):
    # 自定义逻辑

改成继承自djangocms-picture的插件:

from djangocms_picture.cms_plugins import PicturePlugin

class CustomImagePlugin(PicturePlugin):
    # 保留原来的自定义逻辑,调整字段引用(大部分字段如`instance.image`是兼容的)

2. 迁移自定义插件的数据

如果你的自定义插件有额外字段,需要编写迁移脚本复制这些字段。假设你的自定义模型是CustomImage,先修改模型继承关系:

from djangocms_picture.models import Picture

class CustomImage(Picture):
    # 你的自定义字段,比如:
    custom_tag = models.CharField(max_length=100)

然后编写迁移脚本复制旧数据:

from django.db import migrations
from yourapp.models import CustomImage as OldCustomImage
from yourapp.models import CustomImage as NewCustomImage

def migrate_custom_image(apps, schema_editor):
    for old_custom in OldCustomImage.objects.all():
        # 关联之前迁移好的Picture实例
        picture = old_custom.filerimage_ptr.picture_ptr
        new_custom = NewCustomImage.objects.create(
            picture_ptr=picture,
            custom_tag=old_custom.custom_tag,
            # 其他自定义字段
        )
        old_custom.filerimage_ptr = None
        old_custom.save()

class Migration(migrations.Migration):
    dependencies = [
        ('yourapp', '修改模型后的迁移编号'),
        ('djangocms_picture', '0001_initial'),
    ]

    operations = [
        migrations.RunPython(migrate_custom_image),
    ]

验证与清理

  • 运行所有迁移脚本后,启动Django服务器,逐个页面检查插件是否正常显示、数据是否完整。
  • 测试自定义插件的所有功能,确保没有异常。
  • 确认迁移完全成功后,可以卸载旧的cmsplugin-filer包:
    pip uninstall cmsplugin-filer-file cmsplugin-filer-folder cmsplugin-filer-image
    
  • 从INSTALLED_APPS中移除旧插件的条目。

内容的提问来源于stack exchange,提问作者wfehr

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.26 09:50:30