Question

J'ai cette vue dans mon application:

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 boucles for serait de créer une liste de dictionnaires contenant les valeurs de SherdCount.count en référence à la clé étrangère SherdCount.typename (et j’ai pu le faire, même si le code actuel est un peu foiré).

La & table; & la table La liste 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 valeurs 0 sont évidemment fausses. même s'il peut y avoir des zéros (les cellules vides auxquelles je faisais allusion)

La question est, une fois que j'ai créé cette liste, comment créer un tableau dans le modèle avec toutes les cellules (par exemple, une ligne par type et une colonne par contexte, avec SherdCount dans les cellules)?

Steko

Était-ce utile?

La solution

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. Il faut donc faire pivoter la liste des dict en ordre de rangée majeure.

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]

En outre, il est utile de formaliser les résultats sous forme de 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 sous forme de tableau.

<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>
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top