我在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插件。
谢谢,
扎克
答案 0 :(得分:1)
在this thread on GitHub其中一个django-cms开发人员说Django CMS 2.2中没有插件插件架构。
我已经尝试过最新的开发分支,现在正在运行。
答案 1 :(得分:0)
同样的问题
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