A minimal wiki in Django

TheWiki I built a proto-wiki in Django as an exercise for learning how to make a custom template filter. It’s absurdly easy, it turns out. Per the docs I added a templatetags module; here’s all the code in it – wikitags.py:

from django.core import template
register = template.Library()

@register.filter
def wikify(value):
    "Makes WikiWords"
    import re
    wikifier = re.compile(r'\b(([A-Z]+[a-z]+){2,})\b')
    return wikifier.sub(r'<a href="/\1/">\1</a>', value)

Then, in my page template:

{% load wikitags %}
<h1>{{ page.title }}</h1>
<div class="body">
    {{ page.content|wikify }}
</div>
...

I wrote about 60 lines of Python code in total. There are much smaller wiki engines, of course, but given the flexibility and expandability offered by Django I think that’s pretty good.

The source code is available for anyone who’d like to take a look at it. Consider it MIT licensed if for some reason you actually want to use or extend it.

One thing this highlighted for me is that I don’t know the best way to package up a Django app for re-use. Making that process easy, well understood, and perhaps even semi-automated will do a lot for Django as people start accumulating serious components.

Update, 2006-02-13: I’ve modernized the code to work with the “magic-removal” branch of Django.

Luke Plant commented on Mon Dec 12 15:02:45 2005:

Re: packaging apps, this page might be helpful:

http://code.djangoproject.com/wiki/DosAndDontsForApplicationWriters

There is a setup.py example included.


Paul commented on Mon Dec 12 15:15:06 2005:

Excellent, thanks. I came across that many months ago and then forgot about it. I think it’ll be a while before I have anything substantial worth distributing, though…


dp_wiz commented on Sun Jan 1 03:50:18 2006:

Great one! Very very nice and helpfull.


Paul K commented on Sun Dec 24 00:37:30 2006:

Great tutorial, very to the point. Minor correction, on my version of Django the template module resides in a different place. Not sure if it has to do with Django versions. If you get errors try: (remove core)

from django import template


Ankur Sethi commented on Sat Jun 16 08:52:36 2007:

A suggestion that if the site were hosted it would be wonderful, we could see it in action.


Paul commented on Sun Jun 17 17:17:46 2007:

Hi Ankur,

For now, there’s an install here: http://demo.e-scribe.com/wiki/

However, it has absolutely no spam or XSS protection, so I won’t be leaving it up forever.


Tom commented on Thu Jul 5 14:55:07 2007:

Hi Paul,

Thank you for this article and for your site in general.

I have a question about protowiki. Why didn’t you use the create/update/delete generic views that come with Django?

Thanks, Tom


Paul commented on Fri Jul 6 22:56:49 2007:

Hi Tom, I can’t actually remember why I didn’t use generic views with this app. It was originally written over a year and a half ago, which is like 20 in Django years. I think that some of the wiki-specific behavior, like redirecting to an edit page on a 404, might have been more than I wanted to twist generic views to do at the time. In any case, a version that relied more on generic views (wrapping them where needed for special functionality) would be a nice update.


Tom commented :

Everything:~ tomsmith$ hg clone static-http://hg.open.e-scribe.com abort: HTTP Error 404: Not Found

Everything:~ tomsmith$ hg clone http://hg.open.e-scribe.com destination directory: hg.open.e-scribe.com abort: ‘http://hg.open.e-scribe.com/' does not appear to be an hg repository!


Paul commented :

Sorry about that, Tom – fixed now!


machinehuman commented :

Very nice! Do you have plans for spam protection?


Paul commented :

Thanks! This is not something I’m maintaining, but if I were to implement spam protection I’d likely base it on Akismet, like I do for my blog, possibly with DNSBLs as a first line of defense.


Sam Rose commented :

is this code still available?


Josh commented :

Source code link seems broken. Update?


Paul commented :

This code has definitely fallen by the wayside. Here’s a link to it for those who have asked. Be warned: it was last updated around the time of Django 0.96, so it won’t run under 1.x without a little tweaking. http://staticfling.net/_temp/protowiki.zip



Share: