Django Vote/вниз [закрытый] метод

Лямбда, поднимающаяся, используется для превращения закрытия в чистую функцию. Путем передачи дополнительных аргументов функции Вы сокращаете количество ее свободных переменных. Поскольку Вы "снимаете" лямбду в выше и более высокие объемы, Вы добавляете аргументы для размещения локальных переменных, объявленных в том объеме (который был бы свободными переменными иначе). Как только лямбда не имеет никаких свободных переменных, это - чистая "высокоуровневая" функция.

, Конечно, можно только сделать это, если Вы знаете сайты вызова всей лямбды; другими словами, только если лямбда не выходит.

преимущество в оптимизаторе компилятора - то, что закрытия (функциональные среды) могут быть устранены. Это могло бы позволить передать аргументы в регистрах, а не стеке (или "куча") выделение их как свободные переменные.

27
задан irl_irl 6 October 2009 в 23:10
поделиться

4 ответа

Просто подключи и работай: Реализация голосования в стиле Reddit для любой модели с django-голосование
http://code.google.com/p/django-voting/wiki/RedditStyleVoting

12
ответ дан 28 November 2019 в 04:44
поделиться

Что бы вы ни делали, убедитесь, что это отправлено POST, а не GET; Запросы GET не должны никогда изменять информацию базы данных.

10
ответ дан 28 November 2019 в 04:44
поделиться

В качестве ссылки, кнопки или чего-то еще?

Что-то еще, а как насчет изображения?

Когда они щелкают по нему, оно выполняет метод и обновляет страницу?

Возможно, вам лучше использовать ajax для вызова метода сохранения голосования, а не обновления вообще ничего.

Вот что приходит мне в голову.

enter image description here

7
ответ дан 28 November 2019 в 04:44
поделиться

Вот суть моего решения. Я использую изображения с jQuery / AJAX для обработки кликов. Сильно повлиял на этот сайт. Есть кое-что, что может потребовать некоторой работы (например, обработка ошибок в клиенте - и большая часть этого, вероятно, может быть подвергнута рефакторингу), но, надеюсь, код будет вам полезен.

HTML:

        <div class="vote-buttons">
        {% ifequal thisUserUpVote 0 %}
        <img class="vote-up" src = "images/vote-up-off.png" title="Vote this thread UP. (click again to undo)" />
        {% else %}
        <img class="vote-up selected" src = "images/vote-up-on.png" title="Vote this thread UP. (click again to undo)" />
        {% endifequal %}
        {% ifequal thisUserDownVote 0 %}
        <img class="vote-down" src = "images/vote-down-off.png" title="Vote this thread DOWN if it is innapropriate or incorrect. (click again to undo)" />
        {% else %}
        <img class="vote-down selected" src = "images/vote-down-on.png" title="Vote this thread DOWN if it is innapropriate or incorrect. (click again to undo)" />
        {% endifequal %}
        </div> <!-- .votebuttons -->

jQuery:

$(document).ready(function() {

    $('div.vote-buttons img.vote-up').click(function() {

        var id = {{ thread.id }};
        var vote_type = 'up';

        if ($(this).hasClass('selected')) {
            var vote_action = 'recall-vote'
            $.post('/ajax/thread/vote', {id:id, type:vote_type, action:vote_action}, function(response) {
                if (isInt(response)) {
                    $('img.vote-up').removeAttr('src')
                        .attr('src', 'images/vote-up-off.png')
                        .removeClass('selected');
                    $('div.vote-tally span.num').html(response);
                }
            });
        } else {

            var vote_action = 'vote'
            $.post('/ajax/thread/vote', {id:id, type:vote_type, action:vote_action}, function(response) {
                if (isInt(response)) {
                    $('img.vote-up').removeAttr('src')
                        .attr('src', 'images/vote-up-on.png')
                        .addClass('selected');
                    $('div.vote-tally span.num').html(response);
                }
            });
        }
    });

Представление Django, которое обрабатывает запрос AJAX:

def vote(request):
   thread_id = int(request.POST.get('id'))
   vote_type = request.POST.get('type')
   vote_action = request.POST.get('action')

   thread = get_object_or_404(Thread, pk=thread_id)

   thisUserUpVote = thread.userUpVotes.filter(id = request.user.id).count()
   thisUserDownVote = thread.userDownVotes.filter(id = request.user.id).count()

   if (vote_action == 'vote'):
      if (thisUserUpVote == 0) and (thisUserDownVote == 0):
         if (vote_type == 'up'):
            thread.userUpVotes.add(request.user)
         elif (vote_type == 'down'):
            thread.userDownVotes.add(request.user)
         else:
            return HttpResponse('error-unknown vote type')
      else:
         return HttpResponse('error - already voted', thisUserUpVote, thisUserDownVote)
   elif (vote_action == 'recall-vote'):
      if (vote_type == 'up') and (thisUserUpVote == 1):
         thread.userUpVotes.remove(request.user)
      elif (vote_type == 'down') and (thisUserDownVote ==1):
         thread.userDownVotes.remove(request.user)
      else:
         return HttpResponse('error - unknown vote type or no vote to recall')
   else:
      return HttpResponse('error - bad action')


   num_votes = thread.userUpVotes.count() - thread.userDownVotes.count()

   return HttpResponse(num_votes)

И соответствующие части модели потока:

class Thread(models.Model):
    # ...
    userUpVotes = models.ManyToManyField(User, blank=True, related_name='threadUpVotes')
    userDownVotes = models.ManyToManyField(User, blank=True, related_name='threadDownVotes')
33
ответ дан 28 November 2019 в 04:44
поделиться
Другие вопросы по тегам:

Похожие вопросы: