为啥 Django CMS doc'n example Hello Plugin 在渲染时向 hello 模型类添加 <projectname_> 前缀导致错误?

Posted

技术标签:

【中文标题】为啥 Django CMS doc\'n example Hello Plugin 在渲染时向 hello 模型类添加 <projectname_> 前缀导致错误?【英文标题】:Why does Django CMS doc'n example Hello Plugin add <projectname_> prefix to hello model class on render causing error?为什么 Django CMS doc'n example Hello Plugin 在渲染时向 hello 模型类添加 <projectname_> 前缀导致错误? 【发布时间】:2019-09-30 17:43:32 【问题描述】:

我正在尝试在此处复制 Django CMS 文档中的 Hello 插件示例:http://docs.django-cms.org/en/latest/how_to/custom_plugins.html

在 CMS 中,我可以看到并添加 HelloPlugin,但是当我按下保存时,我得到: 异常值:没有这样的表:DEC_hello('DEC'是我的项目名称)

我已将文档中的代码复制/粘贴到 models.py 和 cms_plugins.py 以及 hello_plugin html 中。

我知道在models.py中将常规(models.model)类/表添加到以项目名称为前缀的数据库中是正常的。

但是 class Hello(CMSPlugin) 没有在数据库中创建表。我认为它是不同的,根本不应该作为一个表添加到数据库中,当然也不应该命名为 DEC_hellow。

我已经保存了所有这些 .py 文件并运行 makemigrations 并迁移了几次,但没有发现/进行任何更改。

提前感谢您的帮助。

运行 Django CMS 3.6.0,Django 版本 1.11.20 Python 3.7.3 在 Windows 10 上运行

models.py

from django.db import models
from cms.models.pluginmodel import CMSPlugin

class Hello(CMSPlugin):
    guest_name = models.CharField(max_length=50, default='Guest')

cms_plugins.py

from cms.plugin_base import CMSPluginBase
from cms.plugin_pool import plugin_pool
from django.utils.translation import ugettext_lazy as _

from .models import Hello

@plugin_pool.register_plugin
class HelloPlugin(CMSPluginBase):
    model = Hello
    name = _("Hello Plugin")
    render_template = "hello_plugin.html"
    cache = False

    def render(self, context, instance, placeholder):
        context = super(HelloPlugin, self).render(context, instance, placeholder)
        return context

hello_plugin.html

<h1>Hello % if request.user.is_authenticated %
   request.user.first_name   request.user.last_name
% else %
   instance.guest_name 
% endif %</h1>

点击保存在 CMS 中添加插件时出错:

OperationalError at /en/admin/cms/page/add-plugin/
no such table: DEC_hello
Request Method: POST
Request URL:    http://localhost:8000/en/admin/cms/page/add-plugin/?placeholder_id=41&plugin_type=HelloPlugin&cms_path=/en/purpose-list/&plugin_language=en
Django Version: 1.11.20
Exception Type: OperationalError
Exception Value:    
no such table: DEC_hello
Exception Location: D:\dev\djangocms\lib\site-packages\django\db\backends\sqlite3\base.py in execute, line 328
Python Executable:  D:\dev\djangocms\Scripts\python.exe
Python Version: 3.7.3
Python Path:    
['D:\\dev\\djangocms\\StoneProj',
 'D:\\dev\\djangocms\\Scripts\\python37.zip',
 'D:\\dev\\djangocms\\DLLs',
 'D:\\dev\\djangocms\\lib',
 'D:\\dev\\djangocms\\Scripts',
 'c:\\users\\dad\\appdata\\local\\programs\\python\\python37\\Lib',
 'c:\\users\\dad\\appdata\\local\\programs\\python\\python37\\DLLs',
 'D:\\dev\\djangocms',
 'D:\\dev\\djangocms\\lib\\site-packages']
Server time:    Mon, 13 May 2019 14:01:15 -0400

【问题讨论】:

【参考方案1】:

终于想通了。简单的。我需要跑步 python manage.py makemigrations and ...migrate with my App name (DEC, 在我的例子中) 选项。否则,这些功能仅在基础 django cms 系统/管理数据元素上执行。

【讨论】:

以上是关于为啥 Django CMS doc'n example Hello Plugin 在渲染时向 hello 模型类添加 <projectname_> 前缀导致错误?的主要内容,如果未能解决你的问题,请参考以下文章

无法导入名称六 Django-CMS

Django-CMS - 当我指定模型时,管理员的 CMS 部分消失

将现有的 django 应用程序与 django-cms 集成

django-cms 和 jQuery

Django CMS 教程

cms 之外的 Django CMS 简单占位符