2009-07-01 14 views
6

¿Cuál es la forma correcta de hacer formateo condicional en Django?Django forma de formatear condicional

que tienen un modelo que contiene un campo de fecha, y me gustaría ver una lista de registros, pero el color de las filas en función del valor de dicho campo de fecha. Por ejemplo, los registros que coinciden con la fecha de hoy Quiero ser amarillo, los registros que es antes de hoy quiero verde y unos después de que quiero rojo.

En algún lugar de Django que se necesitan para hacer esa comparación, que compara la fecha actual con la fecha en el registro.

puedo ver tres lugares diferentes que la comparación se podría hacer:

  1. añadir un método para mi modelo, por ejemplo, el estado(), que devuelve bien 'pasado', 'presente', 'futuro' y luego usar eso en la plantilla para colorear las filas.
  2. En la vista en lugar de devolver un conjunto de consultas a la plantilla, pre-proceso de la lista y comparar cada registro, construir una nueva dict que contiene el 'pasado', y los valores 'presente' 'futuro' que se utilizan en la plantilla
  3. Crea una nueva etiqueta de plantilla que haga la comparación.

¿Cuál de estos métodos es la manera correcta de hacerlo de Django? Parece que el formateo condicional es algo que surgiría con bastante frecuencia, y como no se pueden hacer comparaciones arbitrarias en la plantilla, se necesita alguna otra solución.

Lo mismo se aplicaría para las reglas de formato más simples, por ejemplo, si quisiera mostrar una lista de calificaciones de los alumnos, y quería que las que tenían más del 80% de verde y las de menos del 30% de rojo.

Respuesta

8

Soy un gran fan de poner toda la lógica de "negocios" en la función de vista y todas las presentaciones en las plantillas/CSS.

La opción 1 es ideal. Usted devuelve una lista de pares: (fecha, estado), donde el estado es el nombre de la clase ("pasado", "presente", "futuro").

La plantilla utiliza entonces la información de estado como la clase de <span>. Su CSS luego proporciona la codificación de color para ese lapso.

Ahora puede cambiar las reglas sin romper la plantilla. Puede cambiar el CSS sin tocar el código HTML o Python.

{% for date,state in the_date_list %} 
    <span class="{{state}}">date</span> 
{% endfor %} 
+0

Una buena solución, sin embargo, con más de un modelo, tendría que copiar el método del modelo a cada otro modelo con el que quiera hacer esto, haciendo que esta ruta sea un poco húmeda. – googletorp

+0

Sin embargo, la herencia del modelo o una función de utilidad reduciría la duplicación de código. –

+0

@googletorp: la pregunta no mencionaba más de un modelo. La cantidad de código requerido para hacer la asignación de los nombres de las clases es trivial y ciertamente puede ser una función separada, reutilizada o parte de una superclase. –

1

Desde que está haciendo la comparación estática (no hay consultas necesarias), hay que ir por el más seco y la opción fácil de implementar. En este caso, elegiría la opción 4, crear un filtro de plantilla. Entonces podría hacer value | filter para obtener la clase que necesitaría para establecer el color de fondo. Los filtros de plantilla son en realidad un poco más simples que las etiquetas de plantilla para implementar.

3

Tenía un requisito muy similar; ya que esto es bastante conectado con la lógica de negocio, he añadido un método modelo para gestionar este tipo de información, para ser utilizado a continuación en la plantilla:

{% if not bug.within_due_date %}bgcolor="OrangeRed"{% endif %} 

También podría obtenerse a través de una etiqueta de plantilla o filtro; pero en mi caso, sentí el mejor lugar para que la lógica estuviera dentro del modelo; Sugeriría que lo analizaras de la misma manera.

0

También puede consultar la referencia de Django para las etiquetas integradas de Formato y Filtrado.Seguro que tiene lo que está buscando y más, y es un buen enlace para marcar.

Puedes echarle un vistazo here.

Cuestiones relacionadas