Django-cms PlaceholderField в пользовательском плагине, используется в Placeholder, не редактируется в интерфейсе

Я использую django-cms 2.2 в django 1.3, а также репозиторий git django-cms 2.3 в django 1.4, и я замечаю, что если я включу 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.


person Zak Patterson    schedule 19.06.2012    source источник
comment
У меня такая же проблема с django-cms 3.0.0beta2. Вы нашли решение?   -  person Amelse Etomer    schedule 28.09.2013
comment
Та же проблема с 3.0.6   -  person Brandon    schedule 20.10.2014
comment
Кажется, все еще проблема с 3.1.0   -  person BBT    schedule 05.05.2015


Ответы (2)


В этой теме на GitHub один из разработчиков django-cms говорит что в Django CMS 2.2 нет архитектуры плагин-в-плагине.

Я попробовал это с последней веткой разработки, и теперь она работает.

person Amelse Etomer    schedule 10.04.2014

Та же проблема с

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

Одним из нерекомендуемых обходных путей является изменение исходного кода cms в одном месте.

Go to 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
person openHBP    schedule 01.06.2021