Звездная рейтинговая система Джанго и AJAX - PullRequest
5 голосов
/ 12 февраля 2011

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

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

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

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

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


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

Ответы [ 3 ]

9 голосов
/ 13 февраля 2011

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.

4 голосов
/ 12 февраля 2011

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

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

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

1 голос
/ 08 февраля 2015

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

просмотров.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)

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

...