Django-CMS 插件未显示在可用插件中

发布于 2024-11-01 18:38:32 字数 5473 浏览 5 评论 0原文

我一直在尝试编写一个 Django CMS 插件,但它没有显示在页面编辑的“可用插件”中,我非常不确定为什么,因为我已经阅读了其他几个插件的源代码,试图了解我想要的内容。做错了。就好像 Django-CMS 没有注册该插件一样。

目录结构:

/linkrotator
  __init__.py
  admin.py
  cms_plugins.py
  links.html
  models.py
  tests.py
  views.py

cms_plugins.py

from cms.plugin_base import CMSPluginBase
from cms.plugin_pool import plugin_pool
from linkrator.models import LinksPlugin as LinksPluginModel

class LinkListPlugin(CMSPluginBase):
    text_enabled = True
    model = LinkListPluginModel
    render_template = "linkrotator/links.html"

    def render(self, context, instance, placeholder):
        context.update({'instance':instance})
        return context

plugin_pool.register_plugin(LinkListPlugin)

models.py

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

class LinkListPlugin(CMSPlugin):
    linklist = models.ForeignKey('linkrotator.LinkListList', related_name='plugins')

    def __unicode__( self ):
        return self.linklist.name

class Link(models.Model):
    name = models.CharField( max_length = 140 )
    in_list = models.ForeignKey( 'linkrotator.LinkList' )
    link = models.URLField()

    def __unicode__(self):
        return self.name

class LinkList(models.Model):
    name = models.CharField( max_length = 140 )
    in_list = models.ForeignKey('linkrotator.LinkListList', blank = True, null = True, on_delete=models.SET_NULL)

    def __unicode__(self):
        return self.name

class LinkListList(models.Model):
    name = models.CharField( max_length = 140 )
    number_of_links = models.IntegerField()

    def __unicode__(self):
        return self.name

settings.py

# -*- coding: utf-8 -*-
import os

gettext = lambda s: s

PROJECT_DIR = os.path.abspath(os.path.dirname(__file__))

DEBUG = True
TEMPLATE_DEBUG = DEBUG

ADMINS = (
    # ('Your Name', '[email protected]'),
)

MANAGERS = ADMINS

LANGUAGES = [('en', 'en')]
DEFAULT_LANGUAGE = 0

DATABASES = {
    'default': {
        'ENGINE': 'django.db.backends.sqlite3',
        'NAME': os.path.join(PROJECT_DIR, 'mycms.db'),
    }
}

# Local time zone for this installation. Choices can be found here:
# http://en.wikipedia.org/wiki/List_of_tz_zones_by_name
# although not all choices may be available on all operating systems.
# On Unix systems, a value of None will cause Django to use the same
# timezone as the operating system.
# If running in a Windows environment this must be set to the same as your
# system time zone.
TIME_ZONE = 'America/Chicago'

# Language code for this installation. All choices can be found here:
# http://www.i18nguy.com/unicode/language-identifiers.html
LANGUAGE_CODE = 'en-us'

SITE_ID = 1

# If you set this to False, Django will make some optimizations so as not
# to load the internationalization machinery.
USE_I18N = True

# If you set this to False, Django will not format dates, numbers and
# calendars according to the current locale
USE_L10N = True

# Absolute filesystem path to the directory that will hold user-uploaded files.
# Example: "/home/media/media.lawrence.com/"
MEDIA_ROOT = os.path.join(PROJECT_DIR, 'media')

# URL that handles the media served from MEDIA_ROOT. Make sure to use a
# trailing slash if there is a path component (optional in other cases).
# Examples: "http://media.lawrence.com", "http://example.com/media/"
MEDIA_URL = '/media/'

# URL prefix for admin media -- CSS, JavaScript and images. Make sure to use a
# trailing slash.
# Examples: "http://foo.com/media/", "/media/".
ADMIN_MEDIA_PREFIX = '/media/admin/'

# Make this unique, and don't share it with anybody.
SECRET_KEY = '0r6%7gip5tmez*vygfv+u14h@4lbt^8e2^26o#5_f_#b7%cm)u'

# List of callables that know how to import templates from various sources.
TEMPLATE_LOADERS = (
    'django.template.loaders.filesystem.Loader',
    'django.template.loaders.app_directories.Loader',
)

MIDDLEWARE_CLASSES = (
    'django.middleware.common.CommonMiddleware',
    'django.contrib.sessions.middleware.SessionMiddleware',
    'django.middleware.csrf.CsrfViewMiddleware',
    'django.contrib.auth.middleware.AuthenticationMiddleware',
    'django.contrib.messages.middleware.MessageMiddleware',
    'cms.middleware.page.CurrentPageMiddleware',
    'cms.middleware.user.CurrentUserMiddleware',
    'cms.middleware.toolbar.ToolbarMiddleware',
    'cms.middleware.media.PlaceholderMediaMiddleware',
)

TEMPLATE_CONTEXT_PROCESSORS = (
    'django.core.context_processors.auth',
    'django.core.context_processors.i18n',
    'django.core.context_processors.request',
    'django.core.context_processors.media',
    'cms.context_processors.media',
)

CMS_TEMPLATES = (
    ('example.html', 'Example Template'),
)

ROOT_URLCONF = 'urls'

TEMPLATE_DIRS = (
    os.path.join(PROJECT_DIR, 'templates'),
)

INSTALLED_APPS = (
    'django.contrib.auth',
    'django.contrib.contenttypes',
    'django.contrib.sessions',
    'django.contrib.sites',
    'django.contrib.messages',
    'django.contrib.admin',
    'cms',
    'menus',
    'mptt',
    'appmedia',
    'south',
    'cms.plugins.text',
    'cms.plugins.picture',
    'cms.plugins.link',
    'cms.plugins.file',
    'cms.plugins.snippet',
    'cms.plugins.googlemap',
    'snippetology',
    'linkrotator'
)

I've been attempting to write a Django CMS plugin, but it's not showing up in the "Available plugins" on the page edits and I'm very unsure why as I've read the source of another few plugins trying to see what I've done wrong. It's as if Django-CMS hasn't registered the plugin.

Directory structure:

/linkrotator
  __init__.py
  admin.py
  cms_plugins.py
  links.html
  models.py
  tests.py
  views.py

cms_plugins.py

from cms.plugin_base import CMSPluginBase
from cms.plugin_pool import plugin_pool
from linkrator.models import LinksPlugin as LinksPluginModel

class LinkListPlugin(CMSPluginBase):
    text_enabled = True
    model = LinkListPluginModel
    render_template = "linkrotator/links.html"

    def render(self, context, instance, placeholder):
        context.update({'instance':instance})
        return context

plugin_pool.register_plugin(LinkListPlugin)

models.py

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

class LinkListPlugin(CMSPlugin):
    linklist = models.ForeignKey('linkrotator.LinkListList', related_name='plugins')

    def __unicode__( self ):
        return self.linklist.name

class Link(models.Model):
    name = models.CharField( max_length = 140 )
    in_list = models.ForeignKey( 'linkrotator.LinkList' )
    link = models.URLField()

    def __unicode__(self):
        return self.name

class LinkList(models.Model):
    name = models.CharField( max_length = 140 )
    in_list = models.ForeignKey('linkrotator.LinkListList', blank = True, null = True, on_delete=models.SET_NULL)

    def __unicode__(self):
        return self.name

class LinkListList(models.Model):
    name = models.CharField( max_length = 140 )
    number_of_links = models.IntegerField()

    def __unicode__(self):
        return self.name

settings.py

# -*- coding: utf-8 -*-
import os

gettext = lambda s: s

PROJECT_DIR = os.path.abspath(os.path.dirname(__file__))

DEBUG = True
TEMPLATE_DEBUG = DEBUG

ADMINS = (
    # ('Your Name', '[email protected]'),
)

MANAGERS = ADMINS

LANGUAGES = [('en', 'en')]
DEFAULT_LANGUAGE = 0

DATABASES = {
    'default': {
        'ENGINE': 'django.db.backends.sqlite3',
        'NAME': os.path.join(PROJECT_DIR, 'mycms.db'),
    }
}

# Local time zone for this installation. Choices can be found here:
# http://en.wikipedia.org/wiki/List_of_tz_zones_by_name
# although not all choices may be available on all operating systems.
# On Unix systems, a value of None will cause Django to use the same
# timezone as the operating system.
# If running in a Windows environment this must be set to the same as your
# system time zone.
TIME_ZONE = 'America/Chicago'

# Language code for this installation. All choices can be found here:
# http://www.i18nguy.com/unicode/language-identifiers.html
LANGUAGE_CODE = 'en-us'

SITE_ID = 1

# If you set this to False, Django will make some optimizations so as not
# to load the internationalization machinery.
USE_I18N = True

# If you set this to False, Django will not format dates, numbers and
# calendars according to the current locale
USE_L10N = True

# Absolute filesystem path to the directory that will hold user-uploaded files.
# Example: "/home/media/media.lawrence.com/"
MEDIA_ROOT = os.path.join(PROJECT_DIR, 'media')

# URL that handles the media served from MEDIA_ROOT. Make sure to use a
# trailing slash if there is a path component (optional in other cases).
# Examples: "http://media.lawrence.com", "http://example.com/media/"
MEDIA_URL = '/media/'

# URL prefix for admin media -- CSS, JavaScript and images. Make sure to use a
# trailing slash.
# Examples: "http://foo.com/media/", "/media/".
ADMIN_MEDIA_PREFIX = '/media/admin/'

# Make this unique, and don't share it with anybody.
SECRET_KEY = '0r6%7gip5tmez*vygfv+u14h@4lbt^8e2^26o#5_f_#b7%cm)u'

# List of callables that know how to import templates from various sources.
TEMPLATE_LOADERS = (
    'django.template.loaders.filesystem.Loader',
    'django.template.loaders.app_directories.Loader',
)

MIDDLEWARE_CLASSES = (
    'django.middleware.common.CommonMiddleware',
    'django.contrib.sessions.middleware.SessionMiddleware',
    'django.middleware.csrf.CsrfViewMiddleware',
    'django.contrib.auth.middleware.AuthenticationMiddleware',
    'django.contrib.messages.middleware.MessageMiddleware',
    'cms.middleware.page.CurrentPageMiddleware',
    'cms.middleware.user.CurrentUserMiddleware',
    'cms.middleware.toolbar.ToolbarMiddleware',
    'cms.middleware.media.PlaceholderMediaMiddleware',
)

TEMPLATE_CONTEXT_PROCESSORS = (
    'django.core.context_processors.auth',
    'django.core.context_processors.i18n',
    'django.core.context_processors.request',
    'django.core.context_processors.media',
    'cms.context_processors.media',
)

CMS_TEMPLATES = (
    ('example.html', 'Example Template'),
)

ROOT_URLCONF = 'urls'

TEMPLATE_DIRS = (
    os.path.join(PROJECT_DIR, 'templates'),
)

INSTALLED_APPS = (
    'django.contrib.auth',
    'django.contrib.contenttypes',
    'django.contrib.sessions',
    'django.contrib.sites',
    'django.contrib.messages',
    'django.contrib.admin',
    'cms',
    'menus',
    'mptt',
    'appmedia',
    'south',
    'cms.plugins.text',
    'cms.plugins.picture',
    'cms.plugins.link',
    'cms.plugins.file',
    'cms.plugins.snippet',
    'cms.plugins.googlemap',
    'snippetology',
    'linkrotator'
)

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(2

本宫微胖 2024-11-08 18:38:32

问题是 cms_plugins.py 中的导入错误。您执行from linkrator.models import LinksPlugin as LinkListPluginModel,它应该是from linkrotator.models import LinkListPluginModel。您还应该在 LinkListPlugin 上设置一个名称,否则当它显示在可用插件下时,该名称将为空白。给我们:

from linkrotator.models import LinkListPluginModel

class LinkListPlugin(CMSPluginBase):
    name = 'Link rotator'
    text_enabled = True
    model = LinkListPluginModel
    render_template = "linkrotator/links.html"

    def render(self, context, instance, placeholder):
        context.update({'instance':instance})
        return context

一般来说,如果您在加载插件时遇到问题,请打开 Django shell 并尝试从导致问题的应用程序导入 cms_plugins.py 模块。

The problem is an import error in your cms_plugins.py. You do from linkrator.models import LinksPlugin as LinkListPluginModel, it should be from linkrotator.models import LinkListPluginModel. You should also set a name on LinkListPlugin, or the name will be blank when it shows up under available plugins. Giving us:

from linkrotator.models import LinkListPluginModel

class LinkListPlugin(CMSPluginBase):
    name = 'Link rotator'
    text_enabled = True
    model = LinkListPluginModel
    render_template = "linkrotator/links.html"

    def render(self, context, instance, placeholder):
        context.update({'instance':instance})
        return context

Generally speaking, if you have issues with loading plugins, open a Django shell and try importing the cms_plugins.py module from the app causing issues.

伴我老 2024-11-08 18:38:32

我认为你的模板需要位于

linkrotator/templates/linkrotator/links.html

你的结构看起来像的

linkrotator
    templates
        linkrotator
            links.html
    __init__.py
    admin.py
    cms_plugins.py
    models.py
    tests.py
    views.py

文件夹中另外我认为你的插件需要一个名称属性 http://django-cms.readthedocs.org/en/2.1.3/extending_cms/custom_plugins.html#cms-plugins-py

I think your template needs to be in a folder

linkrotator/templates/linkrotator/links.html

your structure will look like

linkrotator
    templates
        linkrotator
            links.html
    __init__.py
    admin.py
    cms_plugins.py
    models.py
    tests.py
    views.py

Also i think your plugin needs a name attribute http://django-cms.readthedocs.org/en/2.1.3/extending_cms/custom_plugins.html#cms-plugins-py

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文