#guestbook/forms.py
#
from django.forms import ModelForm, CharField, ValidationError
from guestbook.models import Entry

class EmptyField(CharField):
	def clean(self, value):
		if value!='':
			raise ValidationError('Please DO NOT fill this field!')
class EntryForm(ModelForm):
	do_not_use=EmptyField(label="Do not fill")
	def __init__(self, data=None, *args, **kwargs):
		if data=={}:
			data=None
		ModelForm.__init__(self, data, *args, **kwargs)
	class Meta:
		model=Entry
#guestbook/models.py
from django.db import models
from django.contrib import admin

class Entry(models.Model):
	nick=models.CharField(max_length=50)
	url=models.URLField(blank=True)
	date=models.DateTimeField(auto_now_add=True)
	text=models.TextField()
try:
	admin.site.register(Entry)
except admin.sites.AlreadyRegistered:
	pass
#guestbook/views.py
from django.shortcuts import render_to_response
from guestbook.models import Entry
from guestbook.forms import EntryForm

def guestbook(request):
	form=EntryForm(request.POST)
	if form.is_valid():
		form.save()
	entries=Entry.objects.all().order_by("-date")
	templates={'form': form, 'entries': entries}
	return render_to_response("gbook.html", templates)
#guestbook/templates/gbook.html
{% extends "base.html" %}
{%block content%}
<h1>Guestbook</h1>
<form action="" method="POST">
<table>
{{form}}
</table>
<input type="submit" value="send" />
</form>
<div class="guestbook">
{%for entry in entries %}
<div class="entry">
<div class="header">
{%if entry.url%}<a href="{{entry.url}}">{%endif%}
<span class="nick">{{entry.nick}}</span>
{%if entry.url%}</a>{%endif%} 
wrote at
<span class="date">{%load humanize%}{{entry.date.date|naturalday}}</span>
<span class="time">{{entry.date.time}}</span>:
</div>
<div class="text">
{{entry.text|linebreaks}}
</div>
</div>
{%endfor%}
</div>
{%endblock%}