Автоматическое увеличение значения поля модели в Django

Я хочу задать вопрос, как я могу увеличить поле модели в django. давайте предположим, что у меня есть модель под названием

класс моих закладок (запросов):

  url=models.URLField()
  popularity=models.IntegerField()

а затем, используя шаблон Django, у меня есть

bookmarks.html

{% для базы данных в list_tagg %}

URL-адрес: {{database.url}}

ПОПУЛЯРНОСТЬ: {{database.popularity}}

{% конец для %}

Теперь: если кто-то нажмет на ссылку (т. е. поле URL на странице bookmarks.html), я бы хотел, чтобы популярность увеличилась на 1. Как я могу это сделать? Любая помощь?


person MajorGeek    schedule 10.02.2011    source источник


Ответы (3)


Используйте F-поля,)

from django.db.models import F

b = Bookmark.objects.get(pk=id_retrieved)
b.popularity = F('popularity') + 1
b.save()
person Almad    schedule 10.02.2011

Возможно, вы захотите реализовать вызов Ajax для подключения к серверу и записи щелчка. Например, используя jQuery, вы можете вызывать эту функцию JS при каждом щелчке мыши:

function incrementPopCounter(pop_id) {
    $.ajax({type: 'POST',
            dataType: 'json',
            url: '/pop/increment',
            data: 'id=' + pop_id,
            success: function(data) {
               if(data.result == 'OK') {
                   // handle success
               } else {
                   // handle failure
               }
            }
           });
    return false;
}

Представление Django для обработки этого может выглядеть так:

from django.utils import simplejson
...
def increment_pop(request):
    if request.is_ajax():
        if 'pop_id' in request.POST and request.POST['pop_id']:
            try:
                pop = Bookmark.objects.get(pk=request.POST['pop_id'])
            except Bookmark.DoesNotExist:
                return HttpResponse(simplejson.dumps({'result': 'No bookmark by that id found.'}),
                                    mimetype='application/json')
            pop.popularity = F('popularity') + 1
            pop.save()
            return HttpResponse(simplejson.dumps({'result': 'OK'}),
                                mimetype='application/json')
        else:
            return HttpResponse(simplejson.dumps({'result': 'Unable to identify the requested bookmark.'}),
                                mimetype='application/json')
    else:
        return HttpResponseBadRequest()
person Cloud Artisans    schedule 10.02.2011

Ответ Алмада можно упростить до следующего:

from django.db.models import F

Bookmark.objects.get(pk=id_retrieved).update(popularity=F('popularity') + 1)
person Matt Deacalion    schedule 20.06.2014