A smooth, flexible CMS to create the designs you like,
built on top of the powerful Django framework.
It fits the purpose perfectly!
from http://dictionary.reference.com/browse/fluent:
from http://www.thefreedictionary.com/fluency:
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:
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.
We’d love to have your help!
You can find more information at the contributing page.
Yes, django-fluent-contents provides exactly that: a “stream of content” that you can use in any model.
Yes, use FLUENT_CONTENTS_PLACEHOLDER_CONFIG
to define the allowed plugins per slot.
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.
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
.
Yes, either by creating a custom page type, or by defining FLUENT_PAGES_PARENT_ADMIN_MIXIN
/ FLUENT_PAGES_CHILD_ADMIN_MIXIN
.
Yes, create a custom ContentPlugin
to show the contents at the page.
Yes, you can define a custom FLUENT_BLOGS_ENTRY_MODEL
, that extends fluent_blogs.base_models
.
Yes, you can define a custom FLUENT_BLOGS_CATEGORY_MODEL
setting. By default, it prefers django-categories-i18n, followed by django-categories.
Yes, all plugins rely on django-any-urlfield to provide URL selectors. Register your model with it, and users can easily link to it.
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.
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.
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.
Yes, all pages can provide the keywords, description and page title text.
Integration for the Search Engine Sitemaps is included.
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.
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.
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.
Yes, you can use Fluent CMS freely in your projects and use it in commercial projects.
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.
The full django-fluent license is located in the project repository for more information.
(text taken from Twitter Bootstrap)