2009-10-06 25 views
25

Tôi đang tạo một ứng dụng nhỏ cho phép người dùng bỏ phiếu các mục lên hoặc xuống. Tôi đang sử dụng Django (và mới cho nó!).Django Vote Up/Down phương pháp

Tôi chỉ tự hỏi, cách tốt nhất để trình bày liên kết upvote cho người dùng là gì. Là một liên kết, nút hoặc cái gì khác?

Tôi đã làm một cái gì đó như thế này trong php với một khuôn khổ khác nhau nhưng tôi không chắc chắn nếu tôi có thể làm điều đó theo cùng một cách. Tôi có nên có một phương pháp để bỏ phiếu lên/xuống và sau đó hiển thị một liên kết để người dùng nhấp vào. Khi họ nhấp vào nó, nó thực hiện phương pháp và làm mới trang?

Trả lời

11

Chỉ cần cắm và chơi:

RedditStyleVoting
Thực hiện phong cách reddit bỏ phiếu cho bất kỳ mẫu với django-bỏ phiếu
http://code.google.com/p/django-voting/wiki/RedditStyleVoting

+0

Điều này có thể hữu ích. Chỉ cần nhìn vào nó ngay bây giờ. Bạn có biết những gì từ liên kết devdocs.apps.kb.models Liên kết phải được thay đổi thành? –

+2

Lợi thế của mã này trong câu trả lời của tôi là nâng cao tiến bộ - nó sẽ hoạt động mà không có Javascript, nhưng bạn có thể thêm AJAX lên trên để làm cho trải nghiệm người dùng tốt hơn. –

+3

thay thế devdocs.apps.kb.models bằng đường dẫn đến tệp models.py của bạn nơi bạn xác định Liên kết. Nó sẽ giống như yourprojectname.yourappname.models. –

4

Là một liên kết, nút hoặc cái gì khác?

Còn gì khác, về hình ảnh?

Khi nhấp vào, nó thực hiện phương pháp và làm mới trang?

Có lẽ bạn nên sử dụng ajax để gọi phương thức lưu phiếu bầu và không làm mới gì cả.

Đây là những gì tôi nghĩ đến.

enter image description here

8

Dù bạn làm gì, hãy đảm bảo rằng nó được gửi bởi POST chứ không phải GET; Yêu cầu GET nên không bao giờ thay đổi thông tin cơ sở dữ liệu.

+0

Anh ấy đúng và nguyên tắc này quy tắc sử dụng liên kết hình ảnh đơn giản để tải lại trang. –

30

Dưới đây là các ý chính của giải pháp của tôi. Tôi sử dụng hình ảnh với jQuery/AJAX để xử lý các nhấp chuột. Chịu ảnh hưởng mạnh mẽ của trang web này. Có một số công cụ có thể sử dụng một số công việc (ví dụ: xử lý lỗi trong máy khách - và phần lớn nó có thể được tái cấu trúc) nhưng hy vọng mã này hữu ích cho bạn.

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

Các 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); 
       } 
      }); 
     } 
    }); 

Quan điểm Django để xử lý yêu cầu 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) 

Và những phần liên quan của mô hình Chủ đề:

class Thread(models.Model): 
    # ... 
    userUpVotes = models.ManyToManyField(User, blank=True, related_name='threadUpVotes') 
    userDownVotes = models.ManyToManyField(User, blank=True, related_name='threadDownVotes') 
+0

Cảm ơn vì điều đó. Bạn đặt mã jquery ở đâu? –

+2

Bạn bao gồm tệp jquery.js với thẻ tập lệnh trong tiêu đề, sau đó bạn có thể gắn thẻ này bên trong thẻ tập lệnh ở bất kỳ đâu trong trang. Tôi thường kết thúc đưa nó trong cùng một mẫu django bao gồm các tập tin như HTML cho rằng một phần của trang để họ ở lại với nhau. jquery.com là một tài nguyên tuyệt vời nếu bạn định bắt đầu thực hiện các công cụ AJAX-y. –

+0

đã thử mã của bạn nhưng tôi không thể nhận các nút có thể nhấp được! –

Các vấn đề liên quan