2009-10-06 13 views
25

मैं एक छोटा ऐप बना रहा हूं जो उपयोगकर्ताओं को या तो ऊपर या नीचे वोट देता है। मैं Django (और इसके लिए नया!) का उपयोग कर रहा हूँ।Django वोट ऊपर/नीचे विधि

मैं बस सोच रहा हूं, उपयोगकर्ता को अपवर्त लिंक प्रस्तुत करने का सबसे अच्छा तरीका क्या है। एक लिंक, बटन या कुछ और के रूप में?

मैंने पहले से ही कुछ अलग फ्रेमवर्क के साथ php में ऐसा कुछ किया है लेकिन मुझे यकीन नहीं है कि मैं इसे वही कर सकता हूं। क्या मेरे पास ऊपर/नीचे वोट के लिए एक विधि होनी चाहिए और उसके बाद क्लिक करने के लिए उपयोगकर्ता को एक लिंक प्रदर्शित करना चाहिए। जब वे इसे क्लिक करते हैं, तो यह विधि करता है और पृष्ठ को रीफ्रेश करता है?

उत्तर

11

बस प्लग और प्ले:

RedditStyleVoting
Django-वोटिंग के साथ किसी भी मॉडल के लिए reddit शैली मतदान को लागू करने
http://code.google.com/p/django-voting/wiki/RedditStyleVoting

+0

यह उपयोगी हो सकता है। बस इसे अभी देख रहे हैं। क्या आप जानते हैं कि devdocs.apps.kb.models से आयात करें लिंक को बदला जाना चाहिए? –

+2

मेरे उत्तर में कोड के इस पर लाभ प्रगतिशील वृद्धि है - यह जावास्क्रिप्ट के बिना काम करेगा, लेकिन आप एक बेहतर उपयोगकर्ता अनुभव बनाने के लिए शीर्ष पर AJAX जोड़ सकते हैं। –

+3

devdocs.apps.kb.models को अपने models.py फ़ाइल के पथ के साथ बदलें जहां आप लिंक को परिभाषित करते हैं। यह आपकेprojectname.yourappname.models की तरह कुछ होगा। –

4

लिंक, बटन या कुछ और के रूप में?

कुछ और, एक छवि के बारे में क्या?

जब वे इसे क्लिक करते हैं, तो यह विधि करता है और पृष्ठ को रीफ्रेश करता है?

शायद आप वोट बचाने के लिए एक विधि का आह्वान करने के लिए अजाक्स का बेहतर उपयोग कर सकते हैं, और कुछ भी ताज़ा नहीं कर सकते हैं।

यह मेरे दिमाग में आता है।

enter image description here

8

तुम जो भी करते हैं, यकीन है कि यह पोस्ट द्वारा सबमिट की जाती है और नहीं बनाते हैं; अनुरोध प्राप्त करें डेटाबेस जानकारी को बदलना चाहिए।

+0

वह सही है, और यह सिद्धांत पृष्ठ को पुनः लोड करने के लिए एक साधारण छवि लिंक का उपयोग करके नियम बनाता है। –

30

यहाँ मेरी समाधान का सार है। मैं क्लिक को संभालने के लिए 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') 
+0

इसके लिए धन्यवाद। आप jquery कोड कहां डालते हैं? –

+2

आप शीर्षलेख में एक स्क्रिप्ट टैग के साथ jquery.js फ़ाइल शामिल करते हैं, तो आप पृष्ठ में कहीं भी स्क्रिप्ट टैग के अंदर इसे चिपका सकते हैं। मैं आमतौर पर इसे उसी django टेम्पलेट में डालने के अंत में फ़ाइल के उस भाग के लिए HTML के रूप में फ़ाइल शामिल करता हूं ताकि वे एक साथ रह सकें। jquery.com एक महान संसाधन है यदि आप AJAX-y सामान करना शुरू करने जा रहे हैं। –

+0

ने अपना कोड आजमाया, लेकिन मैं क्लिक करने योग्य बटन नहीं प्राप्त कर सका! –

संबंधित मुद्दे