By delegating the rendering of a page to another application, you will be able to use customized views and still get all the CMS variables to render a proper navigation.
First you need to register the urlconf module of your application to use it within the admin interface. Here is an example for a document application:
from pages.urlconf_registry import register_urlconf
register_urlconf('Documents', 'example.documents.urls',
label='Display documents')
As soon as you have registered your urlconf, a new field will appear in the page administration. Choose the Display documents. The view used to render this page on the frontend is now choosen by example.documents.urls.
This is a valid example from the documents application:
from django.shortcuts import render_to_response
from django.template import loader, Context, RequestContext
from example.documents.models import Document
def document_view(request, **kwargs):
context = RequestContext(request, kwargs)
documents = Document.objects.filter(page=kwargs['current_page'])
context['documents'] = documents
if kwargs.has_key('document_id'):
document = Document.objects.get(pk=int(kwargs['document_id']))
context['document'] = document
context['in_document_view'] = True
return render_to_response('pages/index.html', context)
The document_view will receive a bunch of extra parameters related to the CMS:
- current_page the page object,
- path the path used to reach the page,
- lang the current language,
- pages_navigation the list of pages used to render navigation.
Note
If the field doesn’t appear within the admin interface make sure that your registry code is executed properly.
Django page CMS provide a solid way to integrate external application forms for managing page related objects (create/delete/update) into the page’s administration interface.
For this you need an object with foreign key pointing to a page:
class Document(models.Model):
"A dummy model used to illustrate the use of linked models in django-page-cms"
title = models.CharField(_('title'), max_length=100, blank=False)
text = models.TextField(_('text'), blank=True)
# the foreign key *must* be called page
page = models.ForeignKey(Page)
class DocumentForm(ModelForm):
class Meta:
model = Document
After that you need to set up the PAGE_CONNECTED_MODELS into your settings similar to this one:
PAGE_CONNECTED_MODELS = [{
'model':'documents.models.Document',
'form':'documents.models.DocumentForm',
'options':{
'extra': 3,
'max_num': 10,
},
},]
When you edit a page, you should see a form to create/update/delete a Document object linked to this page.