How to add some extra fields to the page in django-cms? (in django admin panel)

pmoniq picture pmoniq · Apr 24, 2012 · Viewed 8.7k times · Source

I would like to add some extra fields to pages in django-cms (in django admin panel). How do this in the simplest way?

Answer

Timmy O'Mahony picture Timmy O'Mahony · Apr 24, 2012

Create a new app (called extended_cms or something) and in models.py create the following:

from django.db import models
from django.utils.translation import ugettext_lazy as _
from cms.models.pagemodel import Page

class ExtendedPage(models.Model):   
    page = models.ForeignKey(Page, unique=True, verbose_name=_("Page"), editable=False, related_name='extended_fields')
    my_extra_field = models.CharField(...)

then create an admin.py:

from models import ExtendedPage
from cms.admin.pageadmin import PageAdmin
from cms.models.pagemodel import Page
from django.contrib import admin

class ExtendedPageAdmin(admin.StackedInline):
    model = ExtendedPage
    can_delete = False

PageAdmin.inlines.append(ExtendedPageAdmin)
try:
    admin.site.unregister(Page)
except:
    pass
admin.site.register(Page, PageAdmin)

which will add your extended model to as an inline to any page you create. The easiest way to access the extended model setttings, is to create a context processor:

from django.core.cache import cache
from django.contrib.sites.models import Site

from models import ExtendedPage

def extended_page_options(request):
    cls = ExtendedPage
    extended_page_options = None    
    try:
        extended_page_options = request.current_page.extended_fields.all()[0]
    except:
        pass
    return {
        'extended_page_options' : extended_page_options,
    }

and now you have access to your extra options for the current page using {{ extended_page_options.my_extra_field }} in your templates

Essentially what you are doing is creating a separate model with extra settings that is used as an inline for every CMS Page. I got this from a blog post previously so if I can find that I'll post it.

EDIT

Here is the blog post: http://ilian.i-n-i.org/extending-django-cms-page-model/