FeinCMS是个基于django框架的开源CMS系统,简单高效,集成在django自身的admin界面中,用来做个blog、网站什么的非常方便。不过它的官方文档中没有一个合适的Tutorial,所以比较难以上手。这里把我安装FeinCMS的经历写下来作为Tutorial吧。

以下内容基于python-2.6, django-1.4, FeinCMS-1.6.2,操作系统为MacOS 10.5 + MacPort。

首先要安装FeinCMS。FeinCMS要求django-1.3或django-1.4,如果你没安装过django,请先用以下命令安装:

$ sudo easy_install django

另外FeinCMS还要求mptt,需要先安装mptt:

$ sudo easy_install django-mptt

如果你以前没安装过PIL,还需要安装PIL:

$ sudo easy_install pil

然后就可以安装FeinCMS了:

$ sudo easy_install feincms

接下来我们用FeinCMS建个最基本的网站。首先建个django项目:

$ django-admin.py startproject fein
$ cd fein

需要注意的是,以前django-1.3建立的项目中是没有同名子目录(即fein/fein)的,而django-1.4把settings.pyurls.py等移动到了项目同名子目录(fein/fein)中,在项目外层目录(fein)里只保留了manage.py。这没关系,如果你使用django-1.3,可以直接在fein目录下继续以下操作。

然后要编辑fein/settings.py,加上数据库配置,并顺便在开头加上PROJECT_PATH这个快捷变量。这里为了演示方便起见,就使用SQLite3了。

import os
PROJECT_PATH = os.path.abspath(os.path.dirname(__file__))
...
DATABASES = {
    'default': {
        'ENGINE': 'django.db.backends.sqlite3',
        'NAME': 'fein.db',
    }
}

我们先来试运行一下:

$ python manage.py syncdb
$ python manage.py runserver

第一条命令会提示创建管理员,按照提示输入即可。执行第二条命令后就能在http://localhost:8000/看到django的欢迎画面了。到现在为止,这还只是个django项目,跟FeinCMS完全没有关系。

接下来要编辑fein/settings.py中的INSTALLED_APPS以加载FeinCMS,同时去掉django admin的两个模块前的注释,以启用django的管理界面:

INSTALLED_APPS = (
    ...
    # Uncomment the next line to enable the admin:
    'django.contrib.admin',
    # Uncomment the next line to enable admin documentation:
    'django.contrib.admindocs',
    'feincms',
    'feincms.module.page',
    'feincms.module.medialibrary',
)

修改上传和静态文件的相关设置:

MEDIA_ROOT = os.path.join(PROJECT_PATH, 'media')
MEDIA_URL = '/media/'
STATIC_ROOT = os.path.join(PROJECT_PATH, 'static')
STATIC_URL = '/static/'

然后修改fein/urls.py,打开管理员设置,并将所有请求都转给FeinCMS。顺便设置media目录的访问请求:

import os
from django.conf.urls import patterns, include, url

# Uncomment the next two lines to enable the admin:
from django.contrib import admin
admin.autodiscover()

urlpatterns = patterns('',

    # Uncomment the admin/doc line below to enable admin documentation:
    url(r'^admin/doc/', include('django.contrib.admindocs.urls')),

    # Uncomment the next line to enable the admin:
    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.urls')),
)

然后更新数据库并启动服务器看看:

$ python manage.py syncdb
$ python manage.py runserver

访问http://localhost:800,竟然出错了!错误信息是The page module requires a 'Page.register_templates()' call somewhere ('Page.register_regions()' is not sufficient).。这是什么原因?

这是因为我们还没有注册模板,FeinCMS不知道该怎样渲染页面。好吧,先弄个最简单的模板挂上去。由于模板注册(Page.register_templates)必须在每个请求开始时执行,所以官方文档推荐放到models.py里,但我们的项目里没有modles.py啊。这是当然,因为我们还没有建立app呢。由于使用django-admin.py startapp会建个新的子目录,所以如果我们只是弄个CMS的话,干脆把当前目录当成app目录好了。在settings.py所在的目录下建立models.py(即fein/models.py),内容如下:

from django.utils.translation import ugettext_lazy as _
from django.db import models

from feincms.module.page.models import Page
from feincms.content.richtext.models import RichTextContent
from feincms.content.medialibrary.v2 import MediaFileContent

Page.register_templates({
    'key': 'base',
    'title': 'Base Template',
    'path': 'base.html',
    'regions': (
        ('main', 'Main Region'),
        ('sidebar', 'Sidebar'),
    ),
})

Page.create_content_type(RichTextContent)
Page.create_content_type(MediaFileContent, TYPE_CHOICES=(
    ('default', _('default')),
    ('lightbox', _('lightbox')),
))

最后两行调用create_content_type来创建两种Content Type,即页面内容的类型。然后编辑settings.py,把当前目录加到INSTALLED_APPS里:

INSTALLED_APPS = (
    ...
    'fein',     # 当前项目的名称
),

然后我们还要建个模板(上面代码中的base.html),建个最简单的就好。

$ mkdir fein/templates
$ vi fein/templates/base.html

<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>

顺便把上传目录和静态文件目录建起来:

$ mkdir fein/{static,media}

编辑fein/settings.py加上模板目录:

TEMPLATE_DIRS = (
    os.path.join(PROJECT_PATH, 'templates'),
}

重建数据库并启动:

$ rm fein.db
$ python manage.py syncdb
$ python manage.py runserver

访问http://localhost:8000/,现在应该提示404错误了,那是因为我们还没简历任何页面。好,现在访问http://localhost:8000/admin,就能看到FeinCMS的管理界面了。在Pages里建个页面试试吧。

还有一个小问题,那就是文本编辑器还不能编辑富文档。那是因为我们还没状TinyMCE这个富文档编辑器的缘故。

下载TinyMCE,然后把tiny_mce.js放到fein/static/js/下。然后修改fein/settings.py,增加以下内容:

FEINCMS_RICHTEXT_INIT_CONTEXT = {
    'TINYMCE_JS_URL': STATIC_URL + 'js/tiny_mce/tiny_mce.js',
}

这样FeinCMS就装好了,去后台管理界面添加点内容试试看吧。