【问题标题】:Django-cms PlaceholderField in custom plugin, used in Placeholder, not front-end editable自定义插件中的 Django-cms PlaceholderField,用于占位符,不可前端编辑
【发布时间】:2012-06-21 17:07:39
【问题描述】:

我在 django 1.3 上使用 2.2 django-cms,在 django 1.4 上使用 2.3 django-cms git repo,我注意到如果我在我的模型中包含一个 PlaceholderField,例如:

##books/models.py
class Book(models.Model):
    ...
    description = cmsmodels.PlaceholderField('book_description', null=True, blank=True)

class BookCMSPluginModelItem(models.Model):
    t_book = models.ForeignKey(Book)
    ...

class BookCMSPluginModel(CMSPlugin):
    featured_books = models.ManyToManyField(BookCMSPluginModelItem)
    template = models.CharField(max_length=256, choices= settings.BOOKS_TEMPLATES, default=settings.BOOKS_TEMPLATES[0]);

让我的 CMS 插件像这样:

##books/cms_plugins.py
class BookCMSPlugin(CMSPluginBase):
    model = BookCMSPluginModel
    name = _("Books Plugin")
    
    def render(self, context, instance, placeholder):
        self.render_template = instance.template;
        context['instance'] = instance;
        return context

然后在我的模板中,我发现我可以执行以下操作:

{% for mitem in instance.featured_books.all %}
    <!-- ...... -->
<div>{% render_placeholder mitem.t_book.description %}</div>
{% endfor %}

但是,在前端编辑器中,我添加了我的新插件,并且描述字段确实显示为占位符,但是当我将鼠标悬停在它上面时,我放置插件的外部占位符处于活动状态,并且我无法直接选择内部占位符。它在管理站点中运行良好,因为我可以使用 SemanticEditor 添加内容以及我希望使用的任何其他内容。 然而,在前端,javascript 存在一个令人沮丧的问题,似乎阻止用户添加或编辑内部占位符。

我应该注意到我在这里遵循了精彩的 django-cms 文档:http://docs.django-cms.org/en/latest/extending_cms/placeholders.html,但该站点仅解决了在专门设计的页面中显示模型的上下文中的问题,不幸的是没有使用自定义 django 的模板-cms 插件。

【问题讨论】:

  • 我对 django-cms 3.0.0beta2 也有同样的问题。你找到解决办法了吗?
  • 3.0.6 出现同样的问题
  • 似乎仍然是 3.1.0 的问题

标签: django django-templates django-cms


【解决方案1】:

同样的问题

Django==3.1.6
django-cms==3.8.0
python_version = 3.6.9

一种不推荐的解决方法是在 1 处更改 cms 源代码

转到virtualenvs/your-project-vitualenv/lib/python3.6/site-packages/cms/models

然后编辑文件placeholdermodel

到第 123 行 Placeholder.has_change_permission 并注释第一个 if-return。

=> 注释行 #132 if not attached_models: => 和第 #136 行 return user.is_superuser

保存并重新启动服务器。

def has_change_permission(self, user):
    """
    Returns True if user has permission
    to change all models attached to this placeholder.
    """
    from cms.utils.permissions import get_model_permission_codename

    attached_models = self._get_attached_models()
    
    # Comment this part!
    # if not attached_models:
    #     # technically if placeholder is not attached to anything,
    #     # user should not be able to change it but if is superuser
    #     # then we "should" allow it.
    #     return user.is_superuser

    attached_objects = self._get_attached_objects()

    for obj in attached_objects:
        try:
            perm = obj.has_placeholder_change_permission(user)
        except AttributeError:
            model = type(obj)
            change_perm = get_model_permission_codename(model, 'change')
            perm = user.has_perm(change_perm)

        if not perm:
            return False
    return True

【讨论】:

    【解决方案2】:

    this thread on GitHub 中,一位 django-cms 开发人员说 Django CMS 2.2 中没有插件式插件架构。

    我已经用最新的开发分支进行了尝试,它现在可以工作了。

    【讨论】:

      猜你喜欢
      • 2015-09-09
      • 1970-01-01
      • 2012-10-10
      • 2014-12-10
      • 2016-05-04
      • 2013-12-28
      • 2013-03-22
      • 1970-01-01
      • 2013-10-31
      相关资源
      最近更新 更多