我正在尝试在Django网站上实施星级评分系统。
对我的模型中的评分进行排序,并在页面上显示评分。但我希望用户能够在不刷新或更改页面的情况下对页面进行评级(基本上从1到5)。
我找到了以下内容,就像这里的明星风格一样:http://jvance.com/blog/2008/09/22/JQueryRaterPluginNew.xhtml
目前对javascript和AJAX的理解有限。有没有人知道如何在上面的例子中结合AJAX和Django使用星星,这样你就可以在用户选择评级时更新数据库(模型)而不刷新页面?
用户只能投票一次也很重要,即不允许他们对页面进行两次评级。它存储在模型中是否已经投票以及他们之前的投票是什么。但是我怎样才能修改星星以显示这个?
因此,如果您知道如何做这些事情,或者更合适的星级图形解决方案,或任何好的教程......请分享。谢谢。
答案 0 :(得分:9)
AJAX听起来很可怕而且令人困惑,但并非必须如此。基本上你想要做的是将一些数据发布到特定的url / view组合。有关使用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
选项呈现关联的广播。
答案 1 :(得分:4)
Jonathan欢迎你来到django世界。由于Django是一个很酷的框架,一些djangonauts已经编写了很好的网站来帮助我们。
如果你去http://djangopackages.com/categories/apps/并搜索“评级”,你会发现一些django可插件,其中有一些例子可以帮助你完成项目。
另见另一个问题:Best Practices: How to best implement Rating-Stars in Django Templates
答案 2 :(得分:1)
最近正在研究这个,所以我想我会提供一个解决方案。首先,我使用的是RateIt,我发现它很容易设置并且非常易于使用(将RateIt *.js
和.*css
文件添加到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>
<强> ajax.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!");
}
});
});
一些视图位来自James Bennett(例如设置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)
请记住,这是一个天真的解决方案,只需替换对象列表中最后一项的当前星级分数。这并不理想,因为将分数存储为自己的模型并链接到对象会更好。这是你可以存储它们并进行平均等计算。我现在正在研究这个问题,并在我完成时更新这个答案。