A smooth, flexible CMS to create the designs you like,
built on top of the powerful Django framework.



Where did the name “fluent” come from?

It fits the purpose perfectly!

from http://dictionary.reference.com/browse/fluent:

  1. spoken or written with ease: fluent French.
  2. able to speak or write smoothly, easily, or readily: a fluent speaker; fluent in six languages.
  3. easy; graceful: fluent motion; fluent curves.
  4. flowing, as a stream.
  5. capable of flowing; fluid, as liquids or gases.

from http://www.thefreedictionary.com/fluency:

  1. a. Able to express oneself readily and effortlessly: a fluent speaker; fluent in three languages.
    b. Flowing effortlessly; polished: speaks fluent Russian; gave a fluent performance of the sonata.
  2. Flowing or moving smoothly; graceful: a yacht with long, fluent curves.
  3. 3. Flowing or capable of flowing; fluid.

Why did you create another CMS?

We felt it the landscape of Django CMS apps lacked a set of reusable modules; which are not tied in to each other. You can reuse specific parts of this CMS without having to install the rest.

For example:

  • Use the “contents” module in your site, news/blog module, or even design your own page tree.
  • Use the page tree with custom content.
  • Use the dashboard app only.
  • Use the comments app only.

We take pride in the fact that the modules are easy to use for small sites, and can scale up for larger sites.

Secondly, the modules are not tied into a specific third-party apps. You can use any WYSIWYG editor, any image library or custom model and all plugins will honor those project preferences.

This approach resulted in many spin-off projects. For example, django-parler (translations), django-polymorphic-tree (mptt+polymorphic), and django-staff-toolbar (switching admin/frontend) are all usable for the larger Django community. Existing projects received improvements too, such as the admin interface support in django-polymorphic. Those projects wouldn’t have existed if Fluent CMS didn’t persue such modular approach of separating concerns.

I like what you’re doing, can I contribute?

We’d love to have your help!

You can find more information at the contributing page.


Feature Questions

Can I use the “streaming content” field only?

Yes, django-fluent-contents provides exactly that: a “stream of content” that you can use in any model.

Can I restrict the allowed content plugins?

Yes, use FLUENT_CONTENTS_PLACEHOLDER_CONFIG to define the allowed plugins per slot.

Can I use custom page models?

Yes, even in multiple ways.

Our pages module, django-fluent-pages, allows to define custom models for the page. You can throw all bundled page types away, and write your own if you prefer. The existing “flatpage”, “fluentpage”, “textfile” and “redirectnode” serve as examples for inspiration.

In very domain-specific situations, you can create a custom page model and place django-fluent-contents on  top of it. This is one for the “blog entires”, “FAQ questions” or e-mail templates.

Whatever road you take, reusing django-fluent-pages for your main page structure provides huge benefits. The tree-structure and translations are all handled for you. The content structure can be customly filled in.

Can I customize pages to be very strict on user-input?

Yes, create a custom page type. Our default page types give users freedom, but you can use that same mechanism to provide a very restricted subset of choices to end-users.

Exclude the “fluentpage” page type from your project, and only provide “flatpages” or your custom type. This looses the ability for streaming block content, but gives a simple WYSIWYG editor instead. This is much like how WordPress works without any plugins installed. You can also choose to work with block content, but create restricted plugins instead that are defined in FLUENT_CONTENTS_PLACEHOLDER_CONFIG.

Can I customize the page admin?

Yes, either by creating a custom page type, or by defining FLUENT_PAGES_PARENT_ADMIN_MIXIN / FLUENT_PAGES_CHILD_ADMIN_MIXIN.

Can other content be integrated with CMS pages?

Yes, create a custom ContentPlugin to show the contents at the page.

Can blogs use custom fields?

Yes, you can define a custom FLUENT_BLOGS_ENTRY_MODEL, that extends fluent_blogs.base_models.

Can blogs reuse my own category models?

Yes, you can define a custom FLUENT_BLOGS_CATEGORY_MODEL setting. By default, it prefers django-categories-i18n, followed by django-categories.

Can plugins link to URLs of my models?

Yes, all plugins rely on django-any-urlfield to provide URL selectors. Register your model with it, and users can easily link to it.

Can I use a different WYSIWYG editor?

Yes, we use django-wysiwyg to provide the WYSIWYG editor. The editor can be anything you like, such as TinyMCE, CKEditor, AlloyEditor, or commercial options such as Redactor or Froala. New editors are easily integrated.

Can plugins reuse my media library?

Yes, all plugins rely on django-any-imagefield to provide file selectors.

It supports various media libraries, including django-filer and django-filebrowser, and you can add your own too. This allows to integrate advanced features, such as media categorization or image cropping tools in the admin.

Can I generate thumbnails?

Yes, we recommend using sorl-thumbnail in the templates. You may even override templates of existing plugins in your projects to provide override the HTML output. The following configuration will give a reasonable thumbnail in templates:

{% load thumbnail %}

{% thumbnail instance.image "450x300" crop="center" as im %}
  <img src="{{ im.url }}" srcset="{{ im.url }} 1x,{{ im.url|resolution:'2x' }} 2x"
       width="{{ im.width }}" height="{{ im.height }}" alt="" />
{% endthumbnail %}

Use the THUMBNAIL_ALTERNATIVE_RESOLUTIONS = [2] setting to let sorl-thumbnail generate retina-display thumbnails.

Are SEO features built-in?

Yes, all pages can provide the keywords, description and page title text.

Integration for the Search Engine Sitemaps is included.

Can standard views link to specific pages?

When you define FLUENT_PAGES_KEY_CHOICES, the admins can designate the pages as special.

This is useful to locate the “Terms and Conditions” page, or contact page within the page tree.

Can pages provide new URLs?

Yes, each page type can provide URLs. Hence, your ShopPage can provide articles from the database as self-generated views below the page URL. Another example is a wizard-like view, where all contents is defined on a single page, but rendered as separate sub-URLs.

Can I optimize text after saving?

All HTML fields (that use PluginHtmlField) support FLUENT_TEXT_PRE_FILTERS. This is a list of filters applied over the text, e.g. to sanitize HTML or replace curly “smart” quotes.

Some plugins also support FLUENT_TEXT_POST_FILTERS. This allows destructive changes after saving, such as applying softhyphening, improving typography, avoiding text widows, highlighting ampersands, etc..

For very advanced situations, consider writing a custom text plugin. The existing “text” plugin provides a good example for the minimal boilerplate.



Is this Open Source?

Yes, you can use Fluent CMS freely in your projects and use it in commercial projects.

Why the Apache 2 license, and what does it permit?

We’ve used the Apache License 2.0 for our projects because it provides similar freedoms as the BSD/MIT licenses but takes patents into consideration and it’s better articulated towards lawyers. That’s what a license is written for after all.

django-fluent is released under the Apache 2 license and is copyright 2013 Edoburu. Boiled down to smaller chunks, it can be described with the following conditions.

It allows you to:

  • Freely download and use django-fluent, in whole or in part, for personal, company internal or commercial purposes
  • Use django-fluent in packages or distributions that you create

It forbids you to:

  • Redistribute any piece of django-fluent without proper attribution
  • Use any marks owned by Edoburu in any way that might state or imply that Edoburu endorses your distribution
  • Use any marks owned by Edoburu in any way that might state or imply that you created the Edoburu software in question

It requires you to:

  • Include a copy of the license in any redistribution you may make that includes django-fluent
  • Provide clear attribution to Edoburu for any distributions that include django-fluent

It does not require you to:

  • Include the source of django-fluent itself, or of any modifications you may have made to it, in any redistribution you may assemble that includes it
  • Submit changes that you make to django-fluent back to the django-fluent project (though such feedback is encouraged)

The full django-fluent license is located in the project repository for more information.

(text taken from Twitter Bootstrap)

Fork me on GitHub