如何测试打包为可重用应用的Django-CMS插件

4 投票
1 回答
620 浏览
提问于 2025-04-17 17:15

我按照Django文档中的步骤,制作了一些可以重复使用的Django-CMS插件,并参考了打包指南把它们放到了pypi上,这样就可以通过

pip install cmsplugin-rt

来安装它们,这样Python就能找到它们。当然,我的开发目录是在其他地方。

但是,当我给这个包添加一些测试时,我遇到了错误:

django.core.exceptions.ImproperlyConfigured: App with label cmsplugin_rt could not be found

需要更多的解释。因为这个包不是Django项目的一部分,也就是说没有manage.py文件来运行测试,所以我按照StackOverflow上的建议,在tests目录下添加了runtests.py文件。在这个文件里,我放了:

import os, sys
from django.conf import settings

DIRNAME = os.path.dirname(__file__)
settings.configure(DEBUG=True,
    DATABASES={
        'default': {
            'ENGINE': 'django.db.backends.sqlite3',
         }
     },
    CMS_TEMPLATES = ( ('template_for_tests.html', 'Test template'), ),
    CMS_MODERATOR = False,
    CMS_PERMISSION = False,
    TEMPLATE_CONTEXT_PROCESSORS = (
        'django.contrib.auth.context_processors.auth',
        'django.core.context_processors.i18n',
        'django.core.context_processors.request',
        'django.core.context_processors.media',
        'django.core.context_processors.static',
        'cms.context_processors.media',
        'sekizai.context_processors.sekizai',
    ),
    INSTALLED_APPS = (
        'cmsplugin_rt.button',
        'django.contrib.auth',
        'django.contrib.contenttypes',
        'django.contrib.sessions',
        'django.contrib.admin',
        'django.contrib.sites',
        'django.contrib.messages',
        'django.contrib.staticfiles',
        'south',
        'cms',
        'mptt',
        'menus',
        'sekizai',
    ),
)

from django.test.simple import DjangoTestSuiteRunner
test_runner = DjangoTestSuiteRunner(verbosity=2)
failures = test_runner.run_tests(['cmsplugin_rt', ])
if failures:
    sys.exit(failures)

所以,正如我提到的,当我执行python runtests.py时,我得到了错误:

django.core.exceptions.ImproperlyConfigured: App with label cmsplugin_rt could not be found

我哪里出错了?或者有没有更好的方法来做这个?我很想把测试加进去!

谢谢!

(如果这个能运行,测试会使用我开发的版本,还是会用从pip安装的版本?我每次运行前需要pip uninstall cmsplugin-rt吗?)

这是我的目录结构——我在一个包里有几个插件,这可能是问题的一部分。我把tests目录放在这里,尽管我也试过把它放在上一级。

cmsplugin-rt/
--README.txt
--LICENSE.txt
--MANIFEST.in
--setup.py
--cmsplugin_rt/
----__init__.py
----models.py
----button/
------__init__.py
------models.py
------cms_plugins.py
------templates/
----(other plugins)/
----tests/
------runtests.py
------mytests.py

为了保险起见,我还在顶层放了一个空的models.py(按照这里的建议),但我不确定这是否有区别。

1 个回答

2

为了后续参考,这里是我解决我在第一条评论中提到的南迁移问题的临时方案。虽然这个方法不太美观,但我很希望能听到任何改进的建议。

cmsplugin_rt.button 模型添加新字段的步骤如下:

  1. 在进行任何编辑之前,先把 site-packages/cmsplugin_rt/button 复制到一个虚拟的 Django-CMS 项目中,命名为 button 的应用。
  2. 删除这个新应用的 button/migrations/ 目录。
  3. 在虚拟项目的 settings.py 文件中,把 button 添加到 INSTALLED_APPS 列表里。
  4. 运行 ./manage.py schemamigration --init button,这样虚拟项目对数据库的理解就和当前模型一致(在做任何更改之前)。
  5. 运行 ./manage.py migrate button,以更新虚拟项目的数据库。
  6. 在虚拟项目中编辑按钮的 model.py 文件,添加额外的字段,并进行其他需要的更改。
  7. 运行 ./manage.py schemamigration --auto button,生成迁移代码。这个代码会保存在 button/migrations/0002_auto__... 文件中。
  8. 这个文件是你需要放入你包里的,但如果插件最开始有的不止 0001_initial.py 这个迁移文件,前面的数字会是错误的。把它复制到你的包开发目录中,并确保数字是正确的。同时,复制你所做的任何模型、cms_plugin、模板和其他更改。

撰写回答