2009-10-30 20 views
11

Me gustaría tener calificaciones reutilizables (diseño típico con 5 estrellas). He encontrado esto http://www.thebroth.com/blog/119/css-rating-stars que explica cómo mostrar esto usando css. Para realmente recopilar la calificación, estaba pensando en usar un mapa de imagen o quizás simples botones de opción. Me gustaría usar esto en varios modelos diferentes.Mejores prácticas: Cómo implementar mejor las estrellas de clasificación en las plantillas de Django

¿Cómo harías esto? ¿Debo crear un widget o puedo hacerlo con una plantilla? En realidad, estaba bastante sorprendido de no encontrar nada sobre esto en la web. ¿Es así de simple o poco común?

Respuesta

5

Si recibió algunas respuestas interesantes en la django-users mailing list:

por Mike:

bien que se puede crear un widget, me gusta un modelo de calificación separada mí mismo. Ese recoge el valor y luego lo suma a un total y crea un puntaje o promedio. El modelo almacena el total de votos y el puntaje total, que divido y obtengo mi promedio (hago los cálculos en la vista). Agregándolo a otros modelos con una relación de clave foránea. La aplicación de que los usuarios voten solo una vez rara vez se aplica fuera de la sesión actual o la duración de la cookie. Si lo quiere persistencia, no estoy seguro de lo que es mejor para esto, pero requeriría solo el voto de los usuarios registrados. Ahora, solo muestra el formulario de calificación, lo haría como una etiqueta de inclusión de plantilla y coloque la etiqueta en mis plantillas. Esta etiqueta tiene el formulario básico de envío, el formulario es de dos campos, con un cuadro de selección (fui simple de esta manera) y un campo oculto etiquetado siguiente que apunta a esta página, al que puedo redirigir a. Cuando el usuario envía, en mis puntos de vista para manejar la acción de formularios, acabo de incrementar los votos y el puntaje total y redirigir a la página en la que se votó . Esto está utilizando el botón de envío tradicional, publicando el formulario en una url , devolviendo una vista completa. Si hace algo con javascript que ilumina el número de estrellas para la calificación y haga clic en las estrellas para enviar, aquí es posible que desee publicarlo como objeto json utilizando la solicitud xhr, actualice la vista y devuelva un objeto json con los valores de calificación actualizados, si es un 200, actualice la página con los nuevos valores después de votar (devuelto con el 200). Si es un 500, solucione el error, informándole al usuario que hubo un problema al votar y restablecer las estrellas. Esto es lo que hago, o haría en su lugar, si alguien tiene una idea mejor, por favor hable. Espero que esto ayude. Mike

por Ethan:

De hecho, me acaban de hacer calificaciones de 5 estrellas para un proyecto que estoy trabajando, y tienen estado tratando de averiguar si tengo algo reutilizable vale la liberación como un paquete (y tratando de encontrar el tiempo para resolverlo ...) Describiré lo que hice y lo que solía hacer. Utilicé django-ratings [1,2] para el backend y conecté su RatingField al mis modelos con tarifa. Me gusta jQuery, por lo que para la interfaz utilicé el plugin jquery-star-rating [3,4] como base. Convierte una colección de botones de radio en un widget estrella. I no he mirado de cerca la implementación, pero creo que es básicamente usando la misma técnica CSS que se describe en su enlace. Para comenzar, solo necesita incluir su JS y CSS y agregar class = "star" a los botones de radio en su formulario. Luego escribí un código de vista que envía los datos de solicitud desde los botones de radio a django-ratings. Cosas súper simples, simplemente usé la API de RatingManager django-ratings y manejé las excepciones que arroja - He pegado el fragmento de mi código en [5]. (Estoy usando una versión un poco vieja de django-ratings b/c No he tenido tiempo de actualizar, podría parecer un poco diferente ahora, no estoy seguro) Finalmente, quería dos más cosas: 1) Si un usuario ya ha calificado un elemento y ve el formulario "calificar este elemento" de nuevo, el "widget estrella" debe preconfigurarse con la calificación anterior del usuario, en lugar de mostrar cinco estrellas en blanco. Me di cuenta de que la forma más fácil de hacer era desde el lado del cliente: un evento de carga que simula al usuario haciendo clic en la estrella en la que ya hizo clic. Mi vista y código de plantilla para que está en [6]; Acabo de descubrir los formatos HTML que jquery-star-rating establece y espera, y hace clic en la estrella adecuada para la calificación existente del usuario. 2) Al visualizar el elemento, las calificaciones de los usuarios deberían aparecer como estrellas no interactivas , en lugar de como números. Escribí un filtro de plantilla tonto como las uñas diseñado para tomar un número (la calificación) y devolver un montón de imágenes de estrellas. De nuevo, acabo de utilizar el formato HTML y las clases CSS de jquery-star-rating. Mi código para esto está en [7]. Estaba pensando en poner algo de esto en un campo django-form que renderiza los botones de radio y desencadena jquery-star-rating, todo de una vez, y maneja el envío al back-end django-ratings. Pero no he tenido una oportunidad para resolver eso todavía. De todos modos, espero que esta ayuda, Ethan 1http://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

+1

Todo el referenciado Las URL de pastebin están rotas – glarrain

2

Hay una aplicación django-ratings en PyPi. Puede darle la calificación como un porcentaje 'myinstance.rating.get_percent()' para usar en su plantilla para el ancho del div interno en el truco de CSS que mencionó.

Cuestiones relacionadas