2010-07-05 3 views
6

Ho un progetto Django per la gestione di un elenco di articoli di riviste. Il modello principale è Article. Questo ha vari campi per archiviare cose come titolo dell'articolo, data di pubblicazione, argomento, oltre all'elenco delle società menzionate nell'articolo. (company è il proprio modello).Modelli Django - Stampa di ManyToManyField, separati da virgola, l'elenco dei risultati di ordinamento in dict?

Voglio un modello che stampa un elenco degli articoli, ordinati per categoria, e anche l'elenco delle aziende menzionati.

Tuttavia, sto colpendo due problemi.

In primo luogo, il campo company è un campo ManyToMany. Sto stampando questo con successo ora, usando il all iterabile, grazie a questa domanda SO =). (Curioso però, dove è questo all iterabile documentato nella documentazione di Django?)

listing objects from ManyToManyField

Tuttavia, mi piacerebbe per la stampa "" (virgola seguita da uno spazio) dopo ogni elemento, ad eccezione la ultimo elemento. Così l'output sarà:

Joe Bob Company, Sarah Jane Company, Tool Company 

e non:

Joe Bob Company, Sarah Jane Company, Tool Company, 

Come si fa a raggiungere questo con sistema di template di Django?

In secondo luogo, ogni Article ha un CharField, chiamato category, che memorizza la categoria dell'articolo. Vorrei gli articoli ordinati per categorie, se possibile. Quindi uso QuerySet e ottengo una bella lista di articoli rilevanti in article_list. Quindi utilizzo il tag modello regroup per ordinare questo in categorie e stamparne uno.

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

Tuttavia, ho bisogno di fare in modo che la mia lista di input è ordinato, prima di passarlo a regroup. La mia domanda è, è meglio utilizzare il modello dictsort-tag per ordinare questo all'interno del template, o dovrei usare order_by chiamata di QuerySet invece?

e presumo che sia meglio usare regroup, piuttosto che cercare di codificare questo io stesso in Python all'interno della vista?

Cheers, Victor

risposta

14

prima domanda

Utilizzare il pitone come filtro join

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

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

seconda domanda

La mia domanda è, è meglio usare il dictsort modello-tag per ordinare questo all'interno del template, o dovrei usare chiamata order_by di QuerySet invece?

Vorrei utilizzare order_by di QuerySet. Mi piace fare cose del genere in DB. Beacuse con un enorme set di dati è possibile utilizzare gli indici del database.

E presumo che sia meglio utilizzare il gruppo, piuttosto che provare a codificare personalmente in Python all'interno della visualizzazione?

riorganizzarsi. È decisamente meglio usare le funzioni native di python.

15

Prova forloop.last per la vostra prima domanda

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

Hai svalutato =). Tuttavia, ero curioso: questo metodo è superiore in qualsiasi modo al templatetag "join" nell'altra soluzione? – victorhooi

+4

Penso che siano per due diversi usi. Se hai solo una stringa o un array int, usa join. Se hai un oggetto che devi scorrere, devi usare questo metodo. – killerbarney

+2

Utile anche quando vuoi fare qualcosa del tipo: '{% per azienda in article.companys.all%} {{company.name}} {% se non forloop.last%}, {% endif%} {% endfor%} ' – datakid