Those of you following my posts, anybody?, know that I am experimenting with creating my own little CMS using Django. I am starting by following the Django tutorials. I got through the first 1 and 3/4 tutorials before needing to do some research into how to get my recursive relationship key working in the admin site. It turns out I was a little naive regarding how the model system works in Django. Anyway, I finally got this sorted out and now I am back to continuing with the last part of the second tutorial.
The initial aim of my app is to be able to create multiple menu structures. So far I have two models, a menu model:
class Menu(models.Model):
title = models.CharField(max_length=100)
description = models.CharField(max_length=1000)
in_use = models.BooleanField(default=True)
def __unicode__(self):
return self.title
def is_in_use(self):
return self.in_use == True
and a node model (which might turn into a “page” model in the future):
class Node(models.Model):
title = models.CharField(max_length=100)
sort_order = models.IntegerField(default=1)
menu = models.ForeignKey('Menu')
parent = models.ForeignKey('self', blank=True, null=True)
is_visible = models.BooleanField(default=True)
def __unicode__(self):
return self.title
This has given me the basic admin site that you get from using django.contrib.admin. Customising the admin site is also straightforward. By adding a few lines to the Menu class in my admin.py file I added filtering, searching and the ability to generate multiple nodes whilst adding a menu.
For filtering:
list_filter = ['in_use']
For searching:
search_fields = ['title']
And for multiple nodes I created this class:
class NodeInline(admin.TabularInline):
model = Node
extra = 5
And then appended this line to my MenuAmdin class:
inlines = [NodeInline]
Finally I also modified the data brought back in my list of menus:
list_display = ('title', 'in_use')
I also copied the base_site.html file into my own templates directory and modified it to display my own title in the admin system. I will be playing around with the ability to customise the backend more in the future as this is one the things I really like about Django. It’s so easy to modify the backend.
So far I have written maybe 50 lines of “code” (well really it’s more like templating instructions) and have a fully functioning admin site. This is great, but also a little worrying as I am sure I will hit a major road block in the future with my limited Python knowledge. Still, so far so good.