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

Я хотел бы иметь многоразовые рейтинги (типичный макет с 5 звездами). Я нашел это http://www.thebroth.com/blog/119/css-rating-stars, в котором объясняется, как отображать это с помощью css. Для фактического сбора рейтинга я думал об использовании карты изображения или, возможно, простых переключателей. Я хотел бы использовать это на разных моделях.

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

Ответ 1

Если были получены интересные ответы на список рассылки django-users:

Майка:

Ну, вы можете создать виджет, мне нравится отдельная модель рейтинга. Что собирает значение, а затем добавляет его к сумме и создает счет или в среднем. Модель хранит общее количество голосов и общий балл, который я разделяю и получить мое среднее значение (я делаю математику в представлении). Добавление его в другие модели с отношением внешнего ключа. Обеспечение того, чтобы пользователи голосовали только один раз, редко принудительно за пределами текущей сессии или времени жизни файла cookie. Если вы хотите persistance, я не уверен, что лучше всего для это, но потребует голосования только зарегистрированных пользователей. Теперь вы просто показываете форму оценки, я бы сделал это как включение шаблона и поместите тег в мои шаблоны. Этот тег имеет основную форму отправки, сформировать его, это два поля, с полем выбора (я так просто пошел) и скрытое поле, помеченное рядом, которое указывает на эту страницу, что я могу перенаправить к. Когда пользователь отправляет, в моих представлениях обрабатывать действие форм, я просто увеличивать голоса и общий балл и перенаправлять обратно на страницу, на которой голосовали взято. Это использует традиционную кнопку отправки, отправив форму на url, возвращая полный просмотр. Если вы делаете что-то с javascript, который подсвечивает количество звезд для рейтинг и нажмите на звезды для отправки, здесь вы можете опубликовать его как json, используя запрос xhr, обновить представление и вернуть объект json с помощью обновленные значения рейтинга, если это 200, обновите страницу с новыми значениями после голосования (возвращается с 200). Если это 500, обратитесь к ошибке, позволяя пользователю знать, было голосование по проблеме и reset звезд. Это то, что я делаю или буду делать на вашем месте, если у кого-то есть лучшая идея, пожалуйста, говорите. Надеюсь это поможет. Майк

: Этан:

На самом деле я просто сделал 5-звездочные рейтинги для проекта, над которым я работаю, и пытались выяснить, есть ли у меня что-нибудь, что можно использовать повторно, как пакет (и пытаясь найти время, чтобы понять это). Я опишу что я сделал и что я использовал для этого. Я использовал django-рейтинги [1,2] для бэкэнд и подключил свой RatingField к мои тарифные модели. Мне нравится jQuery, поэтому для интерфейса я использовал плагин jquery-star-rating [3,4] в качестве базы. Он превращает коллекцию переключателей в звездный виджет. я не смотрели внимательно на реализацию, но я думаю, что это в основном используя тот же метод CSS, который описан в вашей ссылке. Чтобы начать работу просто нужно включить его JS и CSS и добавить class= "star" на радио кнопок в вашей форме. Затем я просто написал код представления, который отправляет данные запроса с радио кнопок для django-рейтингов. Супер простой материал, просто использовал django-рейтинги API RatingManager и обрабатывает исключения, которые он выбрасывает - я вставил фрагмент из моего кода в [5]. (Я использую несколько старую версию django-ratings b/c У меня не было времени на обновление; это может выглядеть немного теперь разные, я не уверен.) Наконец, я хотел еще две вещи: 1) Если пользователь уже оценил элемент и просмотрел форму "оценить этот элемент" опять же, "звездный виджет" должен быть предварительно установлен с предыдущим рейтингом пользователя, вместо того, чтобы просто показывать пять пустых звезд. Я понял самый простой способ сделать это было со стороны клиента: событие onload, которое имитирует пользователя нажав на звезду, на которую он уже нажал. Мой код просмотра и шаблона для то есть в [6]; Я просто вычислил HTML-форматы, которые jquery-star-rating устанавливает и ожидает, и нажал на соответствующую звезду для пользователя существующий рейтинг. 2) При просмотре элемента рейтинг пользователей должен отображаться как неинтерактивный звезд, а не как числа. Я написал фильтр шаблонов для немых ногтей предназначенный для того, чтобы взять число (рейтинг) и вернуть кучу звездных изображений. Опять же, я просто использовал HTML-форматирование и CSS-классы из JQuery-звездочный рейтинг. Мой код для этого в [7]. Я думал, что было бы аккуратно поместить некоторые из них в поле формы джанго, позволяет переключателям и запускать jquery-star-рейтинг всего за один раз, и обрабатывает представление в бэкэнде рейтингов django. Но у меня не было шанс еще разобраться. Во всяком случае, надеюсь, что это поможет, Итан 1 http://github.com/dcramer/django-ratings[2] http://pypi.python.org/pypi/django-ratings[3] http://www.fyneworks.com/jquery/star-rating/[4] http://code.google.com/p/jquery-star-rating-plugin/[5] http://pastebin.ca/1650596[6] http://pastebin.ca/1650609[7] http://pastebin.ca/1650616

Ответ 2

В PyPi есть приложение django-ratings. Он может дать вам рейтинг как процент "myinstance.rating.get_percent()" для использования в вашем шаблоне для внутренней ширины div в трюке CSS, о котором вы говорили.