2010-07-05 17 views
6

Tengo un proyecto de Django para administrar una lista de artículos de revistas. El modelo principal es Article. Esto tiene varios campos para almacenar cosas como el título del artículo, la fecha de publicación, el tema, así como la lista de compañías mencionadas en el artículo. (company es su propio modelo).Plantillas de Django: ¿imprime Coma-ManyField separado por comas, ordenando la lista de resultados en dict?

Quiero una plantilla que imprima una lista de los artículos, ordenados por categoría, y que también enumere las compañías mencionadas.

Sin embargo, estoy llegando a dos problemas.

En primer lugar, el campo company es un campo ManyToMany. Estoy imprimiendo esto con éxito ahora, usando el all iterable, gracias a esta pregunta SO =). (Curioso, sin embargo, ¿dónde está este all iterables documentado en la documentación de Django?)

listing objects from ManyToManyField

Sin embargo, me gustaría imprimir "" (coma seguida de espacio) después de cada elemento, excepto la último artículo. Por lo que la salida sería:

Joe Bob Company, Sarah Jane Company, Tool Company 

y no:

Joe Bob Company, Sarah Jane Company, Tool Company, 

¿Cómo se logra esto con sistema de plantillas de Django?

En segundo lugar, cada Article tiene un CharField, llamado category, que almacena la categoría para el artículo. Me gustaría los artículos ordenados por Categorías, si es posible. Así que uso QuerySet y obtengo una buena lista de artículos relevantes en article_list. Luego uso la etiqueta de plantilla regroup para ordenar esto en categorías e imprimir cada una.

{ 'tennis': ('article_4', 'article_5') 
    'cricket': ('article_2', 'article_3') 
    'ping pong': ('article_1') 
} 

Sin embargo, tengo que asegurarme de que mi lista de entrada está ordenada, antes de pasar a regroup. Mi pregunta es, ¿es mejor utilizar la etiqueta de plantilla dictsort para ordenar esto dentro de la plantilla, o debo usar la llamada order_by de QuerySet en su lugar?

Y supongo que es mejor usar regroup, en lugar de intentar codificarlo yo mismo en Python dentro de la vista?

Saludos, Victor

Respuesta

14

primera pregunta

Uso del pitón como filtro de combinación

{{ article.company.all|join:", " }} 

http://docs.djangoproject.com/en/dev/ref/templates/builtins/#join

segunda pregunta

Mi pregunta es, ¿es mejor utilizar la plantilla de etiqueta dictsort para solucionar esto dentro de la plantilla, o debería utilizar llamada order_by de QuerySet en su lugar?

Utilizaría el orden de QuerySet_by. Me gusta hacer esas cosas en DB. Con un gran conjunto de datos, podrías usar índices de bases de datos.

Y supongo que es mejor usar reagrupar, en lugar de intentar codificar esto mismo en Python dentro de la vista?

reagrupar. Definitivamente es mejor usar las funciones nativas de Python.

15

Trate forloop.last a su primera pregunta

{% for company in article.companys.all %} 
    {{company.name}}{% if not forloop.last %}, {% endif %} 
{% endfor %} 
+0

Te votamos a la última vez =). Sin embargo, tenía curiosidad: ¿es este método superior de alguna manera al template de "join" en la otra solución? – victorhooi

+4

Creo que son para dos usos diferentes. Si solo tiene una cadena o una matriz int, entonces use join. Si tiene un objeto por el que debe iterar, debe usar este método. – killerbarney

+2

También es útil cuando quiere hacer algo como: '{% para la compañía en article.companys.all%} {{company.name}} {% if not forloop.last%}, {% endif%} {% endfor%} ' – datakid

Cuestiones relacionadas