FeinCMS - An extensible Django-based CMS¶
FeinCMS is an extremely stupid content management system. It knows nothing about content – just enough to create an admin interface for your own page content types. It lets you reorder page content blocks using a drag-drop interface, and you can add as many content blocks to a region (f.e. the sidebar, the main content region or something else which I haven’t thought of yet). It provides helper functions, which provide ordered lists of page content blocks. That’s all.
Adding your own content types is extremely easy. Do you like markdown that much, that you’d rather die than using a rich text editor? Then add the following code to your project, and you can go on using the CMS without being forced to use whatever the developers deemed best:
from markdown2 import markdown from feincms.module.page.models import Page from django.db import models class MarkdownPageContent(models.Model): content = models.TextField() class Meta: abstract = True def render(self, **kwargs): return markdown(self.content) Page.create_content_type(MarkdownPageContent)
That’s it. Only ten lines of code for your own page content type.
- Installation instructions
- The built-in page module
- Content types - what your page content is built of
- What is a content type anyway?
- Rendering contents in your templates
- Implementing your own content types
- Customizing the render method for different regions
- Extra media for content types
- Influencing request processing through a content type
- Bundled content types
- Restricting a content type to a subset of regions
- Design considerations for content types
- Configuring and self-checking content types at creation time
- Obtaining a concrete content type model
- Administration interfaces
- Integrating 3rd party apps into your site
- Default page handler
- Generic and custom views
- Integrating 3rd party apps
- Adapting the 3rd party application for FeinCMS
- Registering the 3rd party application with FeinCMS’
- Writing the models
- Returning content from views
- Letting the application content use the full power of Django’s template inheritance
- More on reversing URLs
- Additional customization possibilities
- Letting 3rd party apps define navigation entries
- Media library
- Template tags
- Database migration support for FeinCMS
- Versioning database content with
- Advanced topics
- Frequently Asked Questions
- Contributing to the development of FeinCMS
- FeinCMS Deprecation Timeline
- Changed the
template_keyfield type to avoid boring migrations because of changing choices.
render()methods of bundled content types have been changed to return a tuple instead of a HTML fragment in FeinCMS v22.0.0. This was backwards incompatible in some scenarios. Those methods have been changed to return a tuple subclass which automatically renders a HTML fragment if evaluated in a string context.
- Dropped support for Python < 3.8.
- Fixed the thumbnailing support of the
MediaFileForeignKey. It has been broken since Django switched to template-based widget rendering.
- Fixed the
feincms_render_levelrender recursion protection.
- Wrapped the recursive saving of pages in a transaction, so if anything fails we have a consistent state.
- Dropped more compatibility code for Django 1.x.
- Removed the
sixdependency since we’re Python 3-only now.
- Possibly backwards incompatible Changed all bundled content types’
render()methods to return the
(template_name, context)tuple instead of rendering content themselves.
- Dropped compatibility guarantees with Python < 3.6, Django < 3.2.
- Added pre-commit.
- The default view was changed to accept the path as a
pathkeyword argument, not only as a positional argument.
- Changed the item editor action buttons CSS to not use transitions so that the sprite buttons look as they should.
#mainto the more specific
#feincmsmainso that it doesn’t collide with Django’s admin panel markup.
- Renamed the main branch to main.
- Switched to a declarative setup.
- Switched to GitHub actions.
- Sorted imports.
- Added Python up to 3.9, Django up to the main branch (the upcoming 4.0) to the CI list.
- Fixed a bug where the thumbnailer would try to save JPEGs as RGBA.
- Reformatted the code using black, again.
- Added Python 3.8, Django 3.1 to the build.
- Added the Django 3.2 .headers property to the internal dummy response used in the etag request processor.
- Added a workaround for
AppConfig-autodiscovery related crashes. (Because
feincms.appsnow has more meanings). Changed the documentation to prefer
- Added missing
on_deletevalues to the django-filer content types.
- Added a style checking job to the CI matrix.
- Dropped compatibility with Django 1.7.
- Reformatted everything using black.
- Added a fallback import for the
staticfilestemplate tag library which will be gone in Django 3.0.
- Actually made use of the timeout specified as
FEINCMS_THUMBNAIL_CACHE_TIMEOUTinstead of the hardcoded value of seven days.
- Reverted the deprecation of navigation extension autodiscovery.
TranslatedObjectManager.only_languageto evaluate callables before filtering.
- Changed the
renderprotocol of content types to allow returning a tuple of
(ct_template, ct_context)which works the same way as feincms3’s template renderers.
- Added a central changelog instead of creating release notes per release because development is moving more slowly owing to the stable nature of FeinCMS.
- Fixed history (revision) form, recover form and breadcrumbs when FeinCMS is used with Reversion 2.0.x. This accommodates refactoring that took place in Reversion 1.9 and 2.0. If you are upgrading Reversion (rather than starting a new project), please be aware of the significant interface changes and database migrations in that product, and attempt upgrading in a development environment before upgrading a live site.
setup.pyso that dependencies are installed automatically again. Note that some combinations of e.g. Django and django-mptt are incompatible – look at the Travis CI build configuration to find out about supported combinations.
- Fixed a few minor compatibility and performance problems.
- Added a new
FEINCMS_THUMBNAIL_CACHE_TIMEOUTsetting which allows caching whether a thumb exists instead of calling
storage.exists()over and over (which might be slow with remote storages).
- Fixed random reordering of applications by using an ordered dictionary for apps.
- Increased the length of the caption field for media file translations.
feincms.contrib.taggingto actually work with Django versions after 1.9.x.
Old release notes¶
- FeinCMS 1.13 release notes
- FeinCMS 1.12 release notes
- FeinCMS 1.11 release notes
- FeinCMS 1.10 release notes
- FeinCMS 1.9 release notes
- FeinCMS 1.8 release notes
- FeinCMS 1.7 release notes
- FeinCMS 1.6 release notes
- FeinCMS 1.5 release notes
- FeinCMS 1.4 release notes
- FeinCMS 1.3 release notes
- FeinCMS 1.2 release notes