A minimal wiki in Django
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