How can you make a vote-up-down button like in Stackoverflow?

前端 未结 4 1328
佛祖请我去吃肉
佛祖请我去吃肉 2020-12-02 06:28

Problems

  1. how to make an Ajax buttons (upward and downward arrows) such that the number can increase or decrease
  2. how to save the actio
4条回答
  •  借酒劲吻你
    2020-12-02 07:10

    This is a dirty/untested theoretical implementation using jQuery/Django.

    We're going to assume the voting up and down is for questions/answers like on this site, but that can obviously be adjusted to your real life use case.

    The template

    0
    Blah blah blah this is my answer.
    0
    Blah blah blah this is my other answer.

    Javascript

    $(function() {
        $('div.answer img.vote').click(function() {
            var id = $(this).parents('div.answer').attr('id').split('_')[1];
            var vote_type = $(this).hasClass('up') ? 'up' : 'down';
            if($(this).hasClass('selected')) {
                $.post('/vote/', {id: id, type: vote_type}, function(json) {
                    if(json.success == 'success') {
                        $('#answer_' + id)
                         .find('img.' + vote_type);
                         .attr('src', 'vote_' + vote_type + '_selected.png')
                         .addClass('selected');
                        $('div.score', '#answer_' + id).html(json.score);
                    }
                });
            } else {
                $.post('/remove_vote/', {id: id, type: vote_type}, function(json) {
                    if(json.success == 'success') {
                        $('#answer_' + id)
                         .find('img.' + vote_type);
                         .attr('src', 'vote_' + vote_type + '.png')
                         .removeClass('selected');
                        $('div.score', '#answer_' + id).html(json.score);
                    }
                });                
            }
        });
    });
    

    Django views

    def vote(request):
        if request.method == 'POST':
            try:
                answer = Answer.objects.get(pk=request.POST['id'])
            except Answer.DoesNotExist:
                return HttpResponse("{'success': 'false'}")
    
            try:
                vote = Vote.objects.get(answer=answer, user=request.user)
            except Vote.DoesNotExist:
                pass
            else:
                return HttpResponse("{'success': 'false'}")
    
            if request.POST['type'] == 'up':
                answer.score = answer.score + 1
            else:
                answer.score = answer.score - 1
    
            answer.save()
    
            Vote.objects.create(answer=answer,
                                user=request.user,
                                type=request.POST['type'])
    
            return HttpResponse("{'success':'true', 'score':" + answer.score + "}")
        else:
            raise Http404('What are you doing here?')
    
    def remove_vote(request):
        if request.method == 'POST':
            try:
                answer = Answer.objects.get(pk=request.POST['id'])
            except Answer.DoesNotExist:
                return HttpResponse("{'success': 'false'}")
    
            try:
                vote = Vote.objects.get(answer=answer, user=request.user)
            except Vote.DoesNotExist:
                return HttpResponse("{'success': 'false'}")
            else:
                vote.delete()
    
            if request.POST['type'] == 'up':
                answer.score = answer.score - 1
            else:
                answer.score = answer.score + 1
    
            answer.save()
    
            return HttpResponse("{'success':'true', 'score':" + answer.score + "}")
        else:
            raise Http404('What are you doing here?')
    

    Yikes. When I started answering this question I didn't mean to write this much but I got carried away a little bit. You're still missing an initial request to get all the votes when the page is first loaded and such, but I'll leave that as an exercise to the reader. Anyhow, if you are in fact using Django and are interested in a more tested/real implemention of the Stackoverflow voting, I suggest you check out the source code for cnprog.com, a Chinese clone of Stackoverflow written in Python/Django. They released their code and it is pretty decent.

提交回复
热议问题