Extending Django CMS Page Model
… or how to add some fields to the Page model in the admin without changing Django CMS core
The problem: Some times the Page model just lack of something you need. In my case this was “page avatars”. Long story short – I needed an image/avatar for each page in my CMS. So what I have to do was to add a field to the Page model that will keep the info about the avatar path.
Speciality: Of course the simplest solution was just to edit the file(pagemodel.py) that contain the Page model. Unfortunately in the common case(and in my too) several different application resides on a single server and share the same Django CMS. So changing the core code is inconvenient because every change on it will affect all applications that rely on the same CMS core. So what? Copying the whole Django CMS files in my app and modifying them? This does not seems like a good solution too. Fortunately there is a simple way to do that and leave the core code unchanged.
Solution: First you need to create a new model that will hold the new fields you need and a foreign key to the Page model.
from django.db import models from django.utils.translation import ugettext_lazy as _ from cms.models.pagemodel import Page from filebrowser.fields import FileBrowseField as FBF class PageAvatars(models.Model): page = models.ForeignKey(Page, unique=True, verbose_name=_("Page"), editable=False, related_name='extended_fields') big_avatar = FBF(_(u'Big Avatar'), max_length=255, blank=True) small_avatar = FBF(_(u'Small Avatar'), max_length=255, blank=True)
After you define the model it is time to make the admin.
from extended_pages.models import PageAvatars from cms.admin.pageadmin import PageAdmin from cms.models.pagemodel import Page from django.contrib import admin class PageAvatarsAdmin(admin.TabularInline): model = PageAvatars PageAdmin.inlines.append(PageAvatarsAdmin) admin.site.unregister(Page) admin.site.register(Page, PageAdmin)
The last two lines(11 and 12) are used to force Django to reload the Page model admin.
Now you have your new field as an inline in the Page admin.
Final words: As you can see the solution is simple, fast and the core code is unaffected. There is an unique constraint on the page field in PageAvatars model so you will not be able to add more than one avatar per page.
If there is something unclear in the code or you have a better idea I am ready to hear it.
- Extending Django CMS Page model – part II » Between engineering and real life
- Post on request » Between engineering and real life
- Django for Web Prototyping
- Automation, Fabric and Django – presentation
- Django project file structure
- Automated deployment with Ubuntu, Fabric and Django
- Django compressor and image preloading
- Fabric & Django
- Connecting Django Models with outer applications
- Django CMS Plugins with selectable template …
- Language redirects for multilingual sites with Django CMS …
- Foreign key to Django CMS page …