Звездная рейтинговая система Django и AJAX

Я пытаюсь внедрить систему звездного рейтинга на сайте Django.

Хранение оценок в моих моделях отсортировано, как и отображение оценки на странице. Но я хочу, чтобы пользователь мог оценить страницу (по существу, от 1 до 5) без обновления или изменения страницы.

Я нашел следующее, и мне нравится стиль звезд здесь: http://jvance.com/blog/2008/09/22/JQueryRaterPluginNew.xhtml

В настоящее время имеет ограниченное понимание javascript и AJAX. Кто-нибудь знает, как использовать звезды в приведенном выше примере в сочетании с AJAX и Django, чтобы вы могли обновлять базу данных (модели) без обновления страницы, когда пользователь выбирает рейтинг?

Также важно, что пользователи могут проголосовать только один раз, то есть им не разрешается оценивать страницу дважды. В моделях хранится, голосовали ли они уже и каким был их предыдущий голос. Но как мне изменить звезды, чтобы показать это?


Так что, если вы знаете, как это сделать, или более подходящее графическое решение для звездного рейтинга, или какие-либо хорошие учебные пособия... пожалуйста, поделитесь. Спасибо.


person Jon Cox    schedule 12.02.2011    source источник


Ответы (3)


AJAX звучит пугающе и запутанно, но это не обязательно так. По сути, вы хотите опубликовать некоторые данные для определенной комбинации URL/представления. См. jQuery.post для получения дополнительной информации об использовании AJAX для отправки данных на сервер.

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

person Josh Smeaton    schedule 12.02.2011
comment
Спасибо. Теперь у меня все в порядке. Думаю, мне просто нужно было разобраться во всем этом AJAX. - person Jon Cox; 13.02.2011

Джонатан, добро пожаловать в мир джанго. поскольку Django — классный фреймворк, некоторые djangonauts написали хорошие сайты, чтобы помочь нам.

если вы перейдете на http://djangopackages.com/categories/apps/ и выполните поиск "рейтинг" вы найдете несколько подключаемых модулей django с примерами, которые очень помогут вам в вашем проекте.

также см. эти ответы на другой вопрос: Best Практика: как лучше всего реализовать Rating-Stars в шаблонах Django

person panchicore    schedule 12.02.2011

Работая над этим недавно, я решил предоставить решение для микса. Во-первых, я использую 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!");
        }
    });
});

Некоторые биты представления принадлежат Джеймсу Беннетту (например, настройка 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)

Имейте в виду, что это наивное решение, которое просто заменяет текущую звездную оценку в последнем элементе в вашем списке объектов. Это не идеально, так как было бы лучше хранить партитуры как собственную модель и привязывать к объекту. Это было то, что вы можете хранить их и выполнять вычисления, такие как среднее значение и т. Д. Я сейчас работаю над этим и обновлю этот ответ, когда закончу.

person nicorellius    schedule 07.02.2015