2009-03-19 6 views
1

J'ai ce point de vue dans mon application:écrire une table avec des cellules vides en fonction de dictionnaire de valeurs

def context_detail(request, context_id): 
c = get_object_or_404(Context, pk=context_id) 
scs = SherdCount.objects.filter(assemblage__context=c).exclude(count__isnull=True) 
total = sum(sc.count for sc in scs) 
table = [] 
forms = [] 
for a in c.assemblage_set.all(): 
    for sc in a.sherdcount_set.all(): 
     forms.append(sc.typename) 
forms_set = set(forms) 
for a in c.assemblage_set.all(): 
    diko = {} 
    diko['assemblage'] = a 
    for f in forms_set: 
     for sc in a.sherdcount_set.all(): 
      if f == sc.typename: 
       diko[f] = sc.count 
      else: 
       diko[f] = 0 
    table.append(diko) 
return render_to_response('tesi/context_detail.html', 
    {'context': c, 'total': total, 'sherdcounts': scs, 'table': table, 'forms': forms_set}, 
    context_instance=RequestContext(request)) 

L'objectif des deux pour les boucles serait celle de la création d'une liste de dictionnaires qui contient des valeurs de SherdCount .count en référence à la clé étrangère SherdCount.typename (et j'ai été capable de le faire, même si le code actuel est un peu foiré).

La liste "table" devrait contenir quelque chose comme ceci:

[{<Type: Hayes 61B>: 0, <Type: Hayes 99A-B>: 0, <Type: Hayes 105>: 0, <Type: Hayes 104A>: 0, <Type: Hayes 104B>: 0, <Type: Hayes 103>: 0, <Type: Hayes 91>: 0, <Type: Hayes 91A>: 0, <Type: Hayes 91B>: 0, <Type: Hayes 91C>: 0, <Type: Hayes 91D>: 0, <Type: Hayes 85B>: 0, <Type: Hayes 82A>: 0, <Type: Hayes 76>: 0, <Type: Hayes 73>: 0, <Type: Hayes 72>: 0, <Type: Hayes 70>: 0, <Type: Hayes 68>: 0, <Type: Hayes 67>: 0, <Type: Hayes 66>: 0, <Type: Hayes 62A>: 0, <Type: Hayes 80B>: 0, <Type: Hayes 59>: 0, <Type: Hayes 61A>: 0, <Type: Hayes 91A-B>: 0, <Type: Hayes 58>: 0, <Type: Hayes 50>: 0, <Type: Hayes 53>: 0, <Type: Hayes 71>: 0, <Type: Hayes 60>: 0, <Type: Hayes 80A>: 0, <Type: Hayes Style A2-3>: 0, <Type: Hayes Style B>: 0, <Type: Hayes Style E1>: 1, 'assemblage': <Assemblage: Brescia, Santa Giulia : non periodizzato>}, {<Type: Hayes 61B>: 0, <Type: Hayes 99A-B>: 0, <Type: Hayes 105>: 0, <Type: Hayes 104A>: 0, <Type: Hayes 104B>: 0, <Type: Hayes 103>: 0, <Type: Hayes 91>: 0, <Type: Hayes 91A>: 0, <Type: Hayes 91B>: 0, <Type: Hayes 91C>: 0, <Type: Hayes 91D>: 0, <Type: Hayes 85B>: 0, <Type: Hayes 82A>: 0, <Type: Hayes 76>: 0, <Type: Hayes 73>: 0, <Type: Hayes 72>: 0, <Type: Hayes 70>: 0, <Type: Hayes 68>: 0, <Type: Hayes 67>: 0, <Type: Hayes 66>: 0, <Type: Hayes 62A>: 0, <Type: Hayes 80B>: 0, <Type: Hayes 59>: 0, <Type: Hayes 61A>: 0, <Type: Hayes 91A-B>: 0, <Type: Hayes 58>: 0, <Type: Hayes 50>: 0, <Type: Hayes 53>: 0, <Type: Hayes 71>: 0, <Type: Hayes 60>: 0, <Type: Hayes 80A>: 0, <Type: Hayes Style A2-3>: 0, <Type: Hayes Style B>: 3, <Type: Hayes Style E1>: 0, 'assemblage': <Assemblage: Brescia, Santa Giulia : Periodo IIIA>}, 

Mais les nombreuses 0 valeurs sont évidemment faux. même s'il y a peut-être des zéros (les cellules vides auxquelles je faisais référence)

La question est, une fois que j'ai construit une telle liste, comment créer une table dans le gabarit avec toutes les cellules (par exemple 1 rang par Type et 1 colonne par contexte, avec SherdCount à des cellules)?

Steko

+0

Il serait utile de montrer un échantillon de la structure de la table résultante. –

+0

Bien sûr. http://www.linux.it/~steko/static/tesi/contexts/9/index.html Voici un exemple des données de base (sous la rubrique "Forme"). Je voudrais avoir quelque chose comme http://paste.pocoo.org/show/108661/ (naïf, mais donne l'idée) – steko

+0

Pouvez-vous mettre à jour la question avec un échantillon de la valeur de la variable 'table'? –

Répondre

2

Voici la structure de données.

[{<Type1>: 16, 
    <Type2>: 10, 
    <Type3>: 12, 
    <Type4>: 7, 
    <Type5>: 0, 
    'assemblage': <Assemblage1>}, 
{<Type1>: 85, 
    <Type2>: 18, 
    <Type3>: 21, 
    <Type4>: 12, 
    <Type5>: 2, 
    'assemblage': <Assemblage2>}, 
...] 

Le problème est que la table résultante doit être générée dans l'ordre des lignes, et cette liste de dictionnaires est dans l'ordre des colonnes. Donc la liste des dicts doit être pivotée dans l'ordre des rangs.

from collections import defaultdict 
titles = [] 
cells = defaultdict(list) 
for x,col in enumerate(table): 
    titles.append(col['assemblage']) 
    for rk in col: 
     if rk == 'assemblage': continue # skip the title 
     cells[rk][x]= col[rk] 

De plus, il est utile de formaliser les résultats sous la forme d'une liste de listes; les dictionnaires n'ont pas d'ordre inhérent.

final= [] 
for name in sorted(cells.keys()): 
    final.append(cells[name]) 

Voici le modèle pour rendre titles et final comme une table.

<table> 
    <tr> 
    {% for t in titles %}<th>{{t}}</th>{% endfor %} 
    </tr> 
    {% for row in final %} 
    <tr> 
     {% for cell in row %}<td>{{cell}}</td>{% endfor %} 
    </tr> 
    {% endfor %} 
</table> 
+0

Plus ou moins, cela a fonctionné. J'ai dû réécrire une partie du code précédent (qui fuyait quand même). defaultdict est génial .. – steko

Questions connexes