Skip to main content

A widget engine to display various content on Django pages

Project description

build-status

Introduction

The fluent_contents module offers a widget engine to display various content on a Django page.

This engine operates similarly like Django CMS, FeinCMS or django-portlets, however, it can be used for any project, or CMS system.

Page contents can be constructed with multiple “content items”. You can define your own content items, or use one the available content items out of the box. Standard web sites could use the bundled default content items. Other advanced designs (such as a web site with a magazine-like design, having many blocks at a page) can be implemented quickly by defining content items for the various “style elements” at the page.

Web editors are able to place the “content items” at the page, hence they can fill the content of advanced layouts easily and directly in the Django admin. This also applies to pages which have a “free form” or “presentation slide” design, this module allows the end-user to manage and configure the designed elements at the page.

By default, the following content items are available:

Standard content:

  • Text content - write rich text in a WYSIWYG editor (provided by django-wysiwyg).

  • Markup - write content with reStructuredText, Markdown or Textile (provided by docutils, Markdown or textile).

  • Forms - display forms created with django-form-designer.

Online content:

  • Google Docs viewer - display a PDF or DOCX file on a page, using the Google Docs Viewer service.

  • OEmbed support - embed content from YouTube, Vimeo, SlideShare, Twitter, and more.

  • Twitter feed - display a Twitter timeline, or realtime search timeline.

For programmers:

  • Code - display code snippets with highlighting (provided by Pygments).

  • Gist - display Gist snippets from Github.

  • IFrame - display an <iframe> on the page.

  • Raw HTML content - include jQuery snippets, or “embed codes” by other services.

  • Shared content - display a set of items at multiple locations.

Interactive:

For more details, see the documentation at Read The Docs.

Screenshot

The PlaceholderField is nicely integrated in the Django admin interface:

django-fluent-contents placeholder field preview

Secondly, it’s possible to build a CMS Page interface with the PlaceholderEditorAdmin, which displays each content placeholder in a tab:

django-fluent-contents placeholder editor preview

Installation

First install the module, preferably in a virtual environment. It can be installed from PyPI:

pip install django-fluent-contents

Or the current folder can be installed:

pip install .

The dependencies of plugins are not included by default. To install those, include the plugin names as extra option:

pip install django-fluent-contents[code,disquscommentsarea,formdesignerlink,markup,oembeditem,text,twitterfeed]

Configuration

Next, create a project which uses the module:

cd ..
django-admin.py startproject fluentdemo

It should have the following settings:

INSTALLED_APPS += (
    'fluent_contents',

    # And optionally all plugins desired:
    'fluent_contents.plugins.code',
    'fluent_contents.plugins.commentsarea',
    'fluent_contents.plugins.disquswidgets',
    'fluent_contents.plugins.formdesignerlink',
    'fluent_contents.plugins.gist',
    'fluent_contents.plugins.googledocsviewer',
    'fluent_contents.plugins.iframe',
    'fluent_contents.plugins.markup',
    'fluent_contents.plugins.rawhtml',
    'fluent_contents.plugins.text',

    # Some plugins need extra Django applications
    'disqus',
    'django.contrib.comments',
    'django_wysiwyg',
    'form_designer',
)

The database tables can be created afterwards:

./manage.py syncdb

Finally, it needs a model or application that displays the content. There are two ways to include content. The most simply way, is adding a PlaceholderField to a model:

# models.py:

class Article(models.Model):
    title = models.CharField("Title", max_length=200)
    slug = models.SlugField("Slug", unique=True)
    content = PlaceholderField("article_content")

    class Meta:
        verbose_name = "Article"
        verbose_name_plural = "Articles"

    def __unicode__(self):
        return self.title


# admin.py:

class ArticleAdmin(PlaceholderFieldAdmin):
    pass

admin.site.register(Article, ArticleAdmin)

The most advanced combination, is using the PlaceholderEditorAdmin or PlaceholderEditorAdminMixin classes. These classes are designed for CMS-style applications which multiple placeholders on a page. See the provided example application for details.

NOTE:

The django-fluent-pages application is built on top of this API, and provides a ready-to-use CMS that can be implemented with minimal configuration effort. To build a custom CMS, the API documentation of the fluent_contents.admin module provides more details of the classes.

Details about the various settings are explained in the documentation.

Creating custom content items

To implement custom elements of a design - while making them editable for admins - this module allows you to create custom content items. Take a look in the existing types at fluent_contents.plugins to see how it’s being done.

It boils down to creating a package with 2 files:

The models.py file should define the fields of the content item:

from django.db import models
from fluent_contents.models import ContentItem

class AnnouncementBlockItem(ContentItem):
    title = models.CharField("Title", max_length=200)
    body = models.TextField("Body")
    button_text = models.CharField("Text", max_length=200)
    button_link = models.URLField("URL")

    class Meta:
        verbose_name = "Announcement block"
        verbose_name_plural = "Announcement blocks"

    def __unicode__(self):
        return self.title

The content_plugins.py file defines the metadata and rendering:

from fluent_contents.extensions import plugin_pool, ContentPlugin
from .models import AnnouncementBlockItem

@plugin_pool.register
class AnnouncementBlockPlugin(ContentPlugin):
   model = AnnouncementBlockItem
   render_template = "plugins/announcementblock.html"
   category = "Simple blocks"

The plugin can also define the admin layout, by adding fields such as a fieldset, but that is all optional. The template could look like:

<div class="announcement">
    <h3>{{ instance.title }}</h3>
    <div class="text">
        {{ instance.body|linebreaks }}
    </div>
    <p class="button"><a href="{{ instance.button_url }}">{{ instance.button_text }}</a></p>
</div>

Et, voila: web editors are now able to place an announcement items at the page in a very structured manner! Other content items can be created in the same way, either in the same Django application, or in a separate application.

Contributing

This module is designed to be generic. In case there is anything you didn’t like about it, or think it’s not flexible enough, please let us know. We’d love to improve it!

If you have any other valuable contribution, suggestion or idea, please let us know as well because we will look into it. Pull requests are welcome too. :-)

Download files

Download the file for your platform. If you're not sure which to choose, learn more about installing packages.

Source Distribution

django-fluent-contents-1.1.1.tar.gz (163.9 kB view details)

Uploaded Source

Built Distribution

django_fluent_contents-1.1.1-py2.py3-none-any.whl (271.0 kB view details)

Uploaded Python 2 Python 3

File details

Details for the file django-fluent-contents-1.1.1.tar.gz.

File metadata

File hashes

Hashes for django-fluent-contents-1.1.1.tar.gz
Algorithm Hash digest
SHA256 3c377b3c617d78b403180dd5a93190f04e4e5970690a6d4b4b421e727b104b0a
MD5 e515b0304910f26e88b5e64d671a55f7
BLAKE2b-256 2b478478114ef6ace9871394c057ee9f869ec259c20ca5342bd4e06b7e4d42f4

See more details on using hashes here.

File details

Details for the file django_fluent_contents-1.1.1-py2.py3-none-any.whl.

File metadata

File hashes

Hashes for django_fluent_contents-1.1.1-py2.py3-none-any.whl
Algorithm Hash digest
SHA256 f5a92981f382ef4d50e2bdf2fb5660fbb2c2da6519a89ba140db8070b64247bf
MD5 a03dd181046020c6f68195bcea6d00f0
BLAKE2b-256 31b164490d89f3d5875954598222ea037913a23ce42fbf827ac9d84a4df4295b

See more details on using hashes here.

Supported by

AWS AWS Cloud computing and Security Sponsor Datadog Datadog Monitoring Fastly Fastly CDN Google Google Download Analytics Microsoft Microsoft PSF Sponsor Pingdom Pingdom Monitoring Sentry Sentry Error logging StatusPage StatusPage Status page