[Django CMS] Adding plugins inside plugins programatically

I have a task to migrate a website. Old one is plain HTML and new one is Django CMS. I have a script that parses an HTML page from old website in to CMS page and places it into proper place.
Task is to migrate all the page content (that is a CMS TextPlugin) into an interlinked pages setup. Like we have text

<p>blah blah </p><a href="/page/url">Text</a><p> some other text</p>

And I need to change it into CMS LinkPlugin that is nested inside of the TextPlugin. It have become a common standard in the Django CMS world now. Note we need to have a LinkPlugin because of the requirement to interlink pages.
E.g. <a href="/page/url"> is a link to CMS Page object.

The solution is divided into two major parts. First we need to have the link plugin added to a placeholder of the text plugin. It must also be nested by the TextPlugin, like Django CMS admin web UI would do.  So our plugin would look somehow like this in the CMS Page admin:
And the second is modifying the Text Plugin instance itself with placing Link plugin placeholders instead of <a></a> tags we have there.
In this particular example we have a placeholder named "content" and a page containing only one TextPlugin with text in it. We need to modify that text.
First we need to create an instance of a CMSPlugin that is attached to a proper placeholder and is nested in our TextPlugin instance. Creating a Link plugin (an instance of a configuration for that CMS plugin in practice) is a next step to achieve this.
That will be the part 2 of this article. Coming soon.


  1. Thanks, a very helpful article. When can we expect part 2?

  2. I know it has been a long time, but this post has been the only thing I found that helped me create plugins programmatically. I'd like to point that for the links inside text plugin (and for that matter, any other plugin inside the text plugin) can be inserted using the function plugin_to_tag inside package djangocms_text_ckeditor.utils.

    An example would be:

    text = Text(

    icon = Boostrap3IconPlugin(

    text.body = '< ' + 'p' + '>' + gallery.get_text() + plugin_to_tag(icon) + ''

    I think this simplifies the above code because there's no need to make workarounds to include plugins inside the text plugin :)

  3. djangocms' add_plugin does not support a number for the position parameter. You have to set the created plugin's position property afterwards if you care about its position in the placeholder.


Post a Comment

Popular posts from this blog

Python converting PDF to Image

Django: Resetting Passwords (with internal tools)

How to disable/enable an element with jQuery or Javascript