models/foo.py
# the thing table
db.define_table("thing", Field("name"))
# you may want to store likes on another table so you never allow a user to
like the same thing twice
db.define_table("thing_likes",
Field("user", "reference auth_user", notnull=True),
Field("thing", "reference thing", notnull=True),
Field("unikey", unique=True, notnull=True)
)
# this ensure that user cannot like a thing twice
db.thing_likes.unikey.compute = lambda row: "%(user)s-%(thing)s" % row
controllers/default.py
def show_thing():
thing_id = request.args(0)
thing = db.thing[thing_id]
thing_likes = db(db.thing_likes.id == thing.id).count()
return dict(thing=thing. thing_likes=thing_likes)
def like_thing():
thing_id = request.args(0)
user_id = auth.user_id
try:
db.thing_likes.validate_and_insert(
thing=int(thing_id),
user=int(user_id)
)
redirect(URL('show_thing', args=thing_id))
except:
return "thing cannot be liked twice"
views/default/show_thing.html
<h1>{{=thing.name}}</h1>
<a href="{{=URL('like_thing', args=thing.id)}}"> Like this thing </a>
========================
To a better implementation you should use an ajax callback to the "like"
button, and also you should check if user already likes to show a different
button, maybe unlike.
--