【问题标题】:django-cms "You do not have permission to add a plugin" as superuserdjango-cms“您没有权限添加插件”作为超级用户
【发布时间】:2015-01-07 06:40:46
【问题描述】:

我在现有的 Django 1.7 / Python 2.7 项目之上安装了 django-cms 3.0.6(截至今天的最新版本),并使用 sqlite3 作为数据库。

创建了一个简单的模板和占位符后,我在尝试使用前端内容编辑器(例如“通用/图片”插件)添加插件时出现错误。这是我的模板文件:

{% extends "base.html" %}      
{% load cms_tags %}            


{% block content %}            
    {% placeholder template1_content %}
{% endblock %}  

即使我以超级用户身份登录,当我尝试添加插件时,也会出现一个弹出窗口,提示“您没有添加插件的权限”。

除了无法添加插件之外,django-cms 界面的其他一切似乎都运行良好 - 我可以查看管理、创建页面、在实时和草稿之间切换等。

我查看了 django-cms 代码,似乎错误来自 cms.admin.pageadmin.PageAdmin 类中的 publisher_is_draft 检查:

def has_add_plugin_permissions(self, request, placeholder, plugin_type):
    ...
    ...                       
    if page and not page.publisher_is_draft:                                 
        return False                                                         
    return True   

基本上,django-cms 似乎并不认为页面处于草稿模式,即使我已经根据前端进入了“草稿模式”(即:将“实时”模式图标切换为“草稿”)。上述函数中的其他检查通过的事实证实了该错误不是用户权限问题(实际上,正如我上面提到的,错误发生在超级用户身上)而是与页面状态有关。

这只是 django-cms 3.0.6 与 Django 1.7 集成的问题,还是我遗漏了一些明显的东西?有任何想法吗?

【问题讨论】:

  • 你也是员工吗? (is_staff)
  • laffuste:是的,我很活跃,员工和超级用户。
  • 我刚刚遇到了类似的情况,它与任何中间件的复制都无关。就我而言,我使用的是一个 apphooked 模型。该模型扩展了一个 CMS 页面,该页面本身包含一个占位符。然后,这个占位符会出现在我的应用程序的模板中,但由于它连接到 CMS 页面而不是应用程序,因此我无权执行任何操作。

标签: python django content-management-system django-cms


【解决方案1】:

如果我尝试在作为应用实例的页面上添加或调整插件或模板,就会遇到权限问题。

例如,如果您尝试从博客的前端更改某些内容,那么如果您在博客条目上,您将无权这样做 - 您必须在博客的父页面上才能进行任何更改,无论您的状态如何。

这与在一个应用下运行的多个页面的事实有关虚拟网址。

我想一种解决方法——在博客应用的情况下——让画廊之类的东西只出现在父页面的特定子页面上,就是将插件添加到父页面,它是可选的在所有子页面上,但您只需在 99% 的情况下忽略它,它不会影响您不想要的页面。

【讨论】:

    【解决方案2】:

    经过一番挖掘,我将问题缩小到我的 settings.py 文件。在 MIDDLEWARE_CLASSES 中,我最初有一个重复的“django.contrib.sessions.middleware.SessionMiddleware”条目(参见第一行和最后一行):

    MIDDLEWARE_CLASSES = ( 
        'django.contrib.sessions.middleware.SessionMiddleware',
        'django.middleware.csrf.CsrfViewMiddleware', 
        'django.contrib.auth.middleware.AuthenticationMiddleware',
        'django.contrib.messages.middleware.MessageMiddleware',
        'django.middleware.locale.LocaleMiddleware', 
        'django.middleware.doc.XViewMiddleware',
        'django.middleware.common.CommonMiddleware',
        'cms.middleware.user.CurrentUserMiddleware',
        'cms.middleware.page.CurrentPageMiddleware',
        'cms.middleware.toolbar.ToolbarMiddleware',
        'cms.middleware.language.LanguageCookieMiddleware',
    
        'django.contrib.sessions.middleware.SessionMiddleware',
    )
    

    正确的配置是:

    MIDDLEWARE_CLASSES = ( 
        'django.contrib.sessions.middleware.SessionMiddleware',
        'django.middleware.csrf.CsrfViewMiddleware', 
        'django.contrib.auth.middleware.AuthenticationMiddleware',
        'django.contrib.messages.middleware.MessageMiddleware',
        'django.middleware.locale.LocaleMiddleware', 
        'django.middleware.doc.XViewMiddleware',
        'django.middleware.common.CommonMiddleware',
        'cms.middleware.user.CurrentUserMiddleware',
        'cms.middleware.page.CurrentPageMiddleware',
        'cms.middleware.toolbar.ToolbarMiddleware',
        'cms.middleware.language.LanguageCookieMiddleware',
    )
    

    删除此重复行后,重新启动服务器并注销/登录(大概是刷新会话),问题就消失了。另一方面在恢复重复行,重启服务器并注销/登录后,问题又回来了。

    不幸的是,我不明白为什么重复的行会导致问题 - 但是在这个阶段,我可以再推迟一次这样的理解。

    鉴于重复行似乎会导致问题(并且此类问题调试起来可能相当耗时),如果 Django 在出现此类错误配置时抛出错误会很好。

    【讨论】:

    • 因为我不明白为什么重复的行会导致问题,所以我将等待几天接受我自己的答案,以便有人可能提供一些反馈。跨度>
    猜你喜欢
    • 2017-04-24
    • 2021-02-03
    • 2012-07-21
    • 1970-01-01
    • 1970-01-01
    • 2014-11-03
    • 2011-06-12
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多