2011-02-12 227 views
4

我试图在Django网站上实现星级评分系统。Django星级评分系统和AJAX

将评分存储在我的模型中进行排序,就像在页面上显示评分一样。但我希望用户能够对页面进行评分(基本上从1到5),而无需刷新或更改页面。

我已经找到了以下内容,喜欢这里的明星的风格:http://jvance.com/blog/2008/09/22/JQueryRaterPluginNew.xhtml

目前拥有的JavaScript和AJAX了解有限。有谁知道如何结合AJAX和Django使用上述示例中的星型,这样您可以在用户选择评分时更新数据库(模型)而无需刷新页面?

用户只能投票一次也是很重要的,即他们不允许对页面进行两次评分。它存储在模型中,不管它们是否已经投票,以及他们以前的投票是什么。但是,我将如何修改星星来表明这一点?


所以,如果你知道如何做这些事情,或者更恰当的星级图形解决方案,或任何好的教程...请不要份额。谢谢。

回答

9

AJAX听起来很吓人和混乱,但它并没有要。基本上你想要做的是发布一些数据到一个特定的网址/视图组合。有关使用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事物中找到自己的头脑。 – 2011-02-13 03:44:45

4

乔纳森欢迎你到django的世界。因为Django是一个很酷的框架,一些djangonauts编写了很好的网站来帮助我们。

如果你去http://djangopackages.com/categories/apps/并搜索“rating”,你会发现一些django插件,这些插件可以帮助你完成很多项目。

也看到那些UTIL在回答另一个问题:Best Practices: How to best implement Rating-Stars in Django Templates

+0

很感谢,我会检查这些资源。 – 2011-02-12 20:56:30

1

最近工作,所以想到我会提供一个解决方案的混合。首先,我使用RateIt,这是我认为是非常简单的设置,相当intuitve使用(*.js.*css文件添加RateIt您base.html模板):

http://www.radioactivethinking.com/rateit/example/example.htm

这里有关键件到我的解决方案:

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> 

阿贾克斯。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!"); 
     } 
    }); 
}); 

一些视图比特是从詹姆斯贝内特(设定xhr,例如):

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) 

请记住,这是一个天真的解决方案,并且只需替换对象列表中最后一项中的当前明星得分。这并不理想,因为将分数存储为自己的模型并链接到对象会更好。这是你可以存储他们,并做平均计算等。我现在正在处理这个问题,并在完成时更新这个答案。