3

Я пишу сценарий миграции для анализа старого веб-сайта html на страницах CMS Django. Мне нужно понять, как программно вставлять плагины. В частном случае мне нужно иметь html < a> теги, преобразованные в объекты CMS LinkPlugin, вложенные внутри текста, которые редактируются стандартным ckeditor TextPlugin из Django-CMS.Django CMS как создавать вложенные плагины программно

Как программно гнездо плагинов внутри других плагинов Django CMS. В моем случае мне нужно вложить в текст плагин CMS Link внутри TextPlugin. Я знаю, как разбирать текст. Я не понимаю, как это сделать из перспективы вложенных плагинов CMS? Я не могу соединиться с экземпляром объекта плагина Link CMS и экземпляром объекта CMSPlugin, который я вставляю в предка TextPlugin.

Больше контекст:

Примечание Я действительно знаю, как сделать это с точки зрения пользовательского интерфейса. Мне нужно подражать этому в скрипте. Я сбросил базу данных в JSON и заметил, что там есть определенные вещи.

Сначала у меня есть экземпляр класса CMSPlugin, который помещается в заполнитель страницы. (Sotle этой части из placeholderadmin.py К)

  position = CMSPlugin.objects.filter(language=lang, parent=parent).count() 
      plugin = CMSPlugin(
       language='en', 
       position=position, 
       plugin_type=plugin_type, 
       placeholder=placeholder, 
      ) 
      plugin.insert_at(parent, position='last-child', save=False) 
      plugin.save() 

      # ????? 
      plugin.link = Link(
       name='Link text', 
       page_link=target_page, 
       placeholder=placeholder, 
      ) 
      plugin.save() 

Это создает вложенную плагину в соответствующем заполнителе и присоединяет его в текстовом плагин. Однако добавляется пустой экземпляр LinkPlugin. Позднее я создаю экземпляр плагина Link в CMS. Дело в том, что я не знаю, как это сделать должным образом.

С точки зрения пользовательского интерфейса плагин CMS добавлен вложенным, но не содержит реального экземпляра плагина. SO дерево плагинов Admin для этого заполнителя визуализируется пустым плагином Link. Here how it looks CMSPlugins добавлены Ссылка< Пустой>.

Я могу отредактировать этот созданный плагин Link через admin и добавить текст и целевую ссылку. Как это сделать программно. Например. внутри скрипта? Сценарий должен делать 1000 страниц, поэтому я не могу сделать это вручную

ответ

1

Вы пытались сохранить плагин Link, который вы создали?

plugin.link = Link(
      name='Link text', 
      page_link=target_page, 
      placeholder=placeholder, 
     ) 

возможно попытаться добавить

plugin.link.save() 

Я надеюсь, что это так.

3

Извините, что для этого нужно быть последовательным. Это гораздо сложнее в логике, чем кажется. Я сделал статью об этом.

Django CMS Adding plugins inside plugins programmatically

В целом решение имитировать CMS способ сделать это.

# Getting an site admin instance 
    admin_site = AdminSite() 

    instance, plugin_admin = plugin.get_plugin_instance(admin_site) 
    plugin_admin.cms_plugin_instance = plugin 
    plugin_admin.placeholder = plugin.placeholder 

    # Triggering the Django Admin add view with our request. 
    # That's how Django-CMS does this action itself. 
    response = plugin_admin.add_view(request) 

Ищите полный фрагмент в статье. Надеюсь, это поможет кому-то с похожими проблемами.

+0

Я знаю, что это старый ответ, но я хотел бы указать, что это решение больше не будет работать с djangoCMS 3.3.0. Лучший способ добавить плагины программно - использовать cms api (cms.api). – Paulo

2

Чтобы добавить вложенные плагин вам нужно сделать, это:

 add_plugin(
      placeholder=placeholder, 
      plugin_type='TextPlugin', 
      language=translation.get_language(), 
     ) 

     target = placeholder.get_plugins().get(plugin_type='TextPlugin') 

     add_plugin(
      placeholder=placeholder, #same placeholder as the parent plugin 
      plugin_type='LinkPlugin', 
      language=translation.get_language(), 
      target=target, #the parent plugin 
      #here comes the params from the selected plugin 
      name='Google', 
      url='http://www.google.com' 
     ) 

Это также работает с пользовательскими подключаемыми модулями.

Смежные вопросы