a simple guestbook. the guestbook-area and entries can (and should) be styled by CSS. The template extends a "base.html", which should contain a "content" block.
The Model is very simple without moderation, admin-comment or any other advanced features, but its easy to extend.
i.e. add a Field "active=models.BooleanField()" and add "exclude=['active']" to the forms.EntryForm.Meta class for moderated Entries. Now you can switch the entries on/off in the admin-interface by setting active=True/False
this snippet is public domain, use for everything you want.
UPDATE: added basic SPAM protection (a do_not_fill field), but you might want to try a captcha-form/Field like snippet 812
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 | #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%}
|
More like this
- Template tag - list punctuation for a list of items by shapiromatron 10 months, 2 weeks ago
- JSONRequestMiddleware adds a .json() method to your HttpRequests by cdcarter 10 months, 3 weeks ago
- Serializer factory with Django Rest Framework by julio 1 year, 5 months ago
- Image compression before saving the new model / work with JPG, PNG by Schleidens 1 year, 6 months ago
- Help text hyperlinks by sa2812 1 year, 7 months ago
Comments
hi!
if you voted this down, please tell me why.
Only if i know what the problem is, i can help/fix it. Thank you in advance.
#
nice example,
have to enable django.contrib.humanize
btw, check this line, line break missing : admin.site.register(Entry)from django.template import RequestContext
#
This line was a mistake pasting the script, from my more complex application using some RequestContext filling Middleware.
With direct_to_template you do not need a RequestContext in your servlets anyway.
#
hey, didnt work for me... it shows an Csrf error .. I added 'django.middleware.csrf.CsrfResponseMiddleware', to middleware classes...then it shows another error..."'EntryForm' object has no attribute 'is_bound'" dont know what to do :/
#
When using the csrf-middleware, you need to add {%csrf_token%} to your form.
#
@killian you need to call super() in the init method of the form. I guess this snipped is faulty.
#
ModelForm.init(self, data, args, *kwargs) is (here) the same as using super(Modelform, self).init, but super may be the better choice.
#
Please login first before commenting.