2011-02-12 6 views
4

장고 사이트에서 별 등급 시스템을 구현하려고합니다.Django 별 등급 시스템 및 AJAX

내 모델에 점수를 저장하는 것은 페이지에 점수를 표시하는 것과 같이 정렬됩니다. 하지만 사용자가 페이지를 새로 고치거나 변경하지 않고도 페이지를 1에서 5까지 평가할 수 있기를 바랍니다.

나는 다음을 발견, 여기에 스타의 스타일처럼 :

http://jvance.com/blog/2008/09/22/JQueryRaterPluginNew.xhtml 현재 자바 스크립트와 AJAX의 제한된 이해를 가지고있다. 위의 예에서 AJAX 및 Django와 결합 된 별을 사용하는 방법을 알고 있으므로 사용자가 등급을 선택하면 페이지 새로 고침없이 데이터베이스 (모델)를 업데이트 할 수 있습니까?

사용자는 한 번만 투표 할 수 있습니다. 즉, 페이지를 두 번 평가하지 못하게하는 것이 중요합니다. 모델에 이미 투표했는지 여부와 이전 투표의 내용을 저장합니다. 하지만 어떻게 별을 수정하여 이것을 볼 수 있습니까? 당신이 이런 일 또는 더 적절한 성급 호텔 인 그래픽 솔루션, 또는 어떤 좋은 튜토리얼을 수행하는 방법을 알고있는 경우


그래서 ... 몫을 해 주시기 바랍니다. 고맙습니다.

답변

9

AJAX 무서운 혼란 소리 있지만 그럴 필요하지 않습니다. 근본적으로 당신이하고 싶은 것은 특정 URL /보기 콤보에 일부 데이터를 게시하는 것입니다. AJAX를 사용하여 서버에 데이터를 보내는 방법에 대한 자세한 내용은 jQuery.post을 참조하십시오.

#urls 
urlpatterns += patterns('', 
url(r'^article/rate/', 'article.rate'), 

#views 
def rate(request): 
    if request.method == 'POST': 
     # use post data to complete the rating.. 

#javascript 
$.post("/article/rate", { rating: 3, article: 2 }, 
    function(data) { 
     // success! so now set the UI star to 3 
}); 

내가 아는 한 별표 평점은 라디오 컨트롤과 CSS로 생성됩니다. 따라서 페이지로드시 사용자 당 현재 등급을 표시하려면 서식 파일에 checked 옵션과 함께 연결된 라디오를 렌더링하십시오.

+0

감사합니다. 나는 지금 그것을 전부 분류했다. AJAX 전체에 대해 머리를 맞출 필요가 있었다고 생각해보십시오. –

4

조나단 당신은 장고 세계에 오신 것을 환영합니다. Django는 멋진 프레임 워크이므로 일부 장고들은 멋진 사이트를 작성하여 도움을줍니다.

http://djangopackages.com/categories/apps/으로 이동하여 "rating"을 검색하면 프로젝트에 많은 도움이 될 예제가 들어있는 장고 플러그 형 파일을 찾을 수 있습니다.

또 다른 질문에 대한 답변 폴더의 유틸리티들을 참조 : Best Practices: How to best implement Rating-Stars in Django Templates

+0

고맙습니다. 리소스를 확인해 보겠습니다. –

1

최근 작업을 진행하면서 믹스에 대한 해결책을 제시했습니다. 여기

http://www.radioactivethinking.com/rateit/example/example.htm이있다 : 첫째, 내가 발견 RateIt를 사용하고있어 설정이 매우 간단하고 (당신의 base.html 템플릿에 RateIt에게 *.js.*css 파일을 추가)을 사용하는 것은 매우 intuitve 할 수

urls.py

url(r'^object/rate/$', RateMyObjectView.as_view(), name='rate_my_object_view'), 

my_template : 내 솔루션의 핵심 조각 .html 중에서

<div class="rateit" data-rateit-resetable="false">Rate it!</div> 

아약스.(예를 들어, xhr 설정) JS

$('.rateit').bind('click', function(e) { 

    e.preventDefault(); 

    var ri = $(this); 
    var value = ri.rateit('value'); 
    var object_id = ri.data('object_id'); 

    $.ajax({ 
     url: '/object/rate/?xhr', 
     data: { 
      object_id: object_id, 
      value: value 
     }, 
     type: 'post', 
      success: function(data, response) { 
      console.log("ajax call succeeded!"); 
     }, 
      error: function(data, response) { 
      console.log("ajax call failed!"); 
     } 
    }); 
}); 

일부보기 비트 제임스 베넷 출신 :

http://www.b-list.org/weblog/2006/jul/31/django-tips-simple-ajax-example-part-1/

views.py

from django.views.generic.base import View 
from .models import MyObject 

class RateMyObjectView(View): 

    def post(self, request): 

     my_object = MyObject.objects.all().last() 

     xhr = 'xhr' in request.GET 
     star_value = request.POST.get('value', '') 

     my_object.score = star_value 
     my_object.save() 

     response_data = { 
      'message': 'value of star rating:', 
      'value': star_value 
     } 

     if xhr and star_value: 
      response_data.update({'success': True}) 

     else: 
      response_data.update({'success': False}) 

     if xhr: 
      return HttpResponse(json.dumps(response_data), content_type="application/json") 

     return render_to_response(self.template_name, response_data) 

models.py

from django.db import models 

class MyObject(models.Model) 
    score = models.FloatField(max_length=1, default=0) 

이것은 단순한 해결책이며 개체 목록의 마지막 항목에있는 현재 별점을 대체합니다. 점수를 자체 모델로 저장하고 객체에 링크하는 것이 더 좋으므로 이상적이지 않습니다. 이것은 당신이 그들을 저장할 수 있었고, 평균과 같은 계산을했습니다. 저는 지금이 일을하고 있고, 끝나면이 대답을 업데이트 할 것입니다.