My Wiki!

Startup Django FineCMS

Python Virtual Environment

If you haven't already, create a virtual environment:

virtualenv feincms_env
cd         feincms_env

And have the environment activated:

source bin/activate

Install FeinCMS And Its Dependencies

Run the following command to install feincms_env using pip:

pip install feincms

Successfully installed feincms Django django-mptt Pillow feedparser

And install any database driver you might want to use, e.g.:

PostgreSQL:

pip install psycopg2

MySQL:

pip install mysql-python

Note: For additional DB drivers, remember

to install OS level DB packages.

Bug: mariadb prevents mysql-python installation

Use fixed version: mariadb.x86_64 1:5.5.40-2.fc20

  su -c 'yum update --enablerepo=updates-testing mariadb'
  

Working With FeinCMS

Create A Project

Working with FeinCMS is almost the same as a regular Django project.

Follow the below instructions to create a new project:

 # Usage: django-admin.py startproject [project name]
 # Example:
 django-admin.py startproject feincms_app

 # Enter the application directory:
 cd feincms_app

Initiate FeinCMS As A Django App

Next, we need to initiate FeinCMS as a Django application before configuring the new Django project we created.

Run the following to create a FeinCMS Django app:

python manage.py startapp cms

Configure Project's Settings (settings.py)

Similar to Django CMS, we need to configure the Django project we created. This will mostly consist of adding FeinCMS as an installed application, followed by deciding on the database engine to use.

Let's edit the settings.py file using the nano text editor:

nano feincms_app/settings.py

Scroll down the file and find the section entitled INSTALLED_APPS and change it:

From this:

INSTALLED_APPS = (
    'django.contrib.admin',
    'django.contrib.auth',
    'django.contrib.contenttypes',
    'django.contrib.sessions',
    'django.contrib.messages',
    'django.contrib.staticfiles',
)

To this:

INSTALLED_APPS = (

    # FeinCMS:
    'feincms',
    'feincms.module.page',
    'feincms.module.medialibrary',
    'cms',

    # Django Standard:
    'django.contrib.admin',
    'django.contrib.auth',
    'django.contrib.contenttypes',
    'django.contrib.sessions',
    'django.contrib.messages',
    'django.contrib.staticfiles',

)

Note: If django.contrib.admin is commented (# django.contrib.admin), comment it out.

Next step is adding the TEMPLATECONTEXTPROCESSORS settings.

Append the below code block to the file:

TEMPLATE_CONTEXT_PROCESSORS = (

    'django.contrib.auth.context_processors.auth',
    'django.contrib.messages.context_processors.messages',
    'django.core.context_processors.i18n',
    'django.core.context_processors.request',
    'django.core.context_processors.media',
    'django.core.context_processors.static',

)

The database engine which comes pre-configured is the SQLite 3. If you wish to use a different one other than the standard, you need to configure and define it here as well. Scroll down the file and find the DATABASES configuration block. Once there, edit it as necessary, e.g.:

# Default SQLite:
DATABASES = {
    'default': {
        'ENGINE': 'django.db.backends.sqlite3',
        'NAME': os.path.join(BASE_DIR, 'db.sqlite3'),
    }
}    
# PostgreSQL example:
# DATABASES = {
#     'default': {
#         'ENGINE': 'django.db.backends.postgresql_psycopg2',
#         'NAME': 'name',
#         'USER': 'user_name',
#         'PASSWORD': 'pwd',
#         'HOST': 'host.add.ress',
#         'PORT': '5432',
#     }
# }

Once you are done with the database settings, it is time to define some template directories.

Add the following line somewhere suitable on the file:

TEMPLATE_DIRS = (

    # List of template directories.
    # Example:
    os.path.join(BASE_DIR, 'templates'),

)

Configure URLs (urls.py)

Edit urls.py configuration file using nano:

 nano feincms_app/urls.py

Replace the contents with something similar to below, suiting your needs:

import os

from django.conf.urls import patterns, include, url
from django.conf.urls.i18n import i18n_patterns
from django.contrib import admin
from django.contrib.staticfiles.urls import staticfiles_urlpatterns

admin.autodiscover()

urlpatterns = patterns('',

    url(r'^admin/', include(admin.site.urls)),
    url(r'^media/(?P<path>.*)$', 'django.views.static.serve', {
        'document_root': os.path.join(os.path.dirname(__file__), 'media/')}),
    url(r'', include('feincms.contrib.preview.urls')),
    url(r'', include('feincms.urls'))

) + staticfiles_urlpatterns()

Creating The First Model

As we have mentioned at the beginning, FeinCMS is more of a framework than a plain, everything-extracted CMS. It requires models to be defined in order to work. Therefore, before creating the database schema, we need to define the models.

Execute the below command to start editing models.py of cms Django app we created:

vim cms/models.py

And replace the content of the file with the following to create a new model:

from feincms.module.page.models import Page
from django.utils.translation import ugettext_lazy as _
from feincms.content.richtext.models import RichTextContent

Page.register_templates({
    'title': _('General FeinCMS Template Example'),
    'path': 'template1.html',
    'regions': (
        ('header', _('Page header.')),
        ('main', _('Main content area.')),
        ('sidebar', _('Sidebar'), 'inherited'),
        ('footer', _('Page footer.')),
    ),
})

Page.create_content_type(RichTextContent)

Note: To learn more about page models, check out the official documentation for a detailed example: FeinCMS Page Module.

Initiate The Database

After the configurations, it is time to initiate the database and create the models / database schema.

Run the following to create the database:

python manage.py syncdb

Once you execute this command, you will be asked a series of questions, e.g.:

# You just installed Django's auth system,
# which means you don't have any superusers defined.
# Would you like to create one now? (yes/no):
yes
# ^^ Create an admin account by answering the questions.
# For testing purposes you can opt for:
# Username: admin
# Password: admin

Creating The Template

Let's create our template model, which will be used to render the model from the previous step.

Create the templates directory:

mkdir feincms_app/templates

Run the following to create the first template file using nano:

nano feincms_app/templates/template1.html

And copy-and-paste the below template contents, modifying to suit your needs:

<div id="header">
    {% block header %}
    {% for content in feincms_page.content.header %}
        {{ content.render }}
    {% endfor %}
    {% endblock %}
</div>

<div id="content">
    {% block content %}
    {% for content in feincms_page.content.main %}
        {{ content.render }}
    {% endfor %}
    {% endblock %}
</div>

<div id="sidebar">
    {% block sidebar %}
    {% for content in feincms_page.content.sidebar %}
        {{ content.render }}
    {% endfor %}
    {% endblock %}
</div>

<div id="footer">
    {% block footer %}
    {% for content in feincms_page.content.footer %}
        {{ content.render }}
    {% endfor %}
    {% endblock %}
</div>

Test The Application

Run the following command to run a sample application server:

python manage.py runserver 0.0.0.0:8000

You can check out your installation by visiting the admin section of FeinCMS on your droplet:

http://[your droplet's IP]:8000/admin

Note: To terminate the test server, press CTRL+C. Create Your First Content

Visit the admin section by going to:

http://[your droplet's IP]:8000/admin

Login with admin credentials you have set and press “Log In”.

Note: You might need to use the defaults for logging in - admin and admin respectively.

Create a page by pressing the “Add” button found next to “Pages” on the list.

And that's it!

Getting Ready For Production

When you are finished creating your Django CMS project, you should try to avoid relying on the testing server the application comes with.

For deployments, a fully-fledged web-application server (e.g. Unicorn) must be used, preferably behind a reverse-proxy that will handle the initial processing of requests and distribution of static files (such as images).

To get a quick overall idea of how to go to production, check out the section titles “Getting Ready For Production”on our article: How To Prepare Ubuntu Cloud Servers For Python Web-Applications. Summary

If you have already been through this article once, or, if you do not fancy copy-pasting commands one by one, here is a quick summary of installation instructions to get you started up until configurations:

# Preare the system and install Python tools:
aptitude    update
aptitude -y upgrade
aptitude install -y build-essential
aptitude install -y cvs subversion git-core mercurial
aptitude install python-setuptools python-dev python2.7-dev python-software-properties libpq-dev
aptitude install libtiff4-dev libjpeg8-dev zlib1g-dev libfreetype6-dev liblcms2-dev libwebp-dev tcl8.5-dev tk8.5-dev
curl https://bitbucket.org/pypa/setuptools/raw/bootstrap/ez_setup.py | python -
curl https://raw.github.com/pypa/pip/master/contrib/get-pip.py | python -
export PATH="/usr/local/bin:$PATH"
pip install virtualenv

# Create a virtual environment:
virtualenv feincms_env
cd feincms_env    
source bin/activate
pip install feincms

# Create a CMS project:
django-admin.py startproject feincms_app
cd feincms_app
python manage.py startapp cms

# And continue with configurations ..

Navigation