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. --