User Tools

Site Tools


doc:appunti:prog:django

Differences

This shows you the differences between two versions of the page.

Link to this comparison view

Both sides previous revisionPrevious revision
doc:appunti:prog:django [2011/06/26 11:49] – [Mettere i dati nella vista] niccolodoc:appunti:prog:django [2011/06/28 09:15] (current) – [Mettere i dati nella vista] niccolo
Line 225: Line 225:
 </code> </code>
  
-FIXME Da fare:+==== Visualizzazione e aggregazione dei dati ====
  
-  Aggiungere nella vista l'importazione del modello dati. +Nel codice della **view** è possibile accedere ai dati (i **model**) sfruttando anche le relazioni tra essi (le //foreign key// delle tabelle del database). È possibile anche usare funzioni di aggregazione. 
-  Aggiungere nel template l'iterazione per mostrare tutti gli oggetti del modello+ 
-  Trovare il modo per mostrare i dati aggregati (somma di un campo, ecc.).+Ecco un esempio di una vista dell'applicazione **spese** (**''my_project/spese/views.py''**), che accede ai dati del modello **''User''** e del modello correlato **''Expense''** (sono tabelle correlate). Nella vista si aggiunge un attributo al modello ''User'', aggregando per ogni ''User'' il campo ''amount'' del modello ''Expense''calcolando la **''Sum''** e il **''Count''**: 
 + 
 +<code python> 
 +from django.http import HttpResponse 
 +from django.template import Context 
 +from django.template.loader import get_template 
 + 
 +from django.db.models import Sum, Count 
 + 
 +from django.contrib.auth.models import User 
 +#from spese.models import Expense 
 + 
 +def balance(request)
 + 
 +    users = User.objects.all() 
 + 
 +    max_expense = 0 
 +    for user in users: 
 +        user.aggr = user.expense_set.aggregate(Count('amount'), Sum('amount')) 
 +        if user.aggr['amount__sum'] > max_expense: 
 +            max_expense = user.aggr['amount__sum'
 +    for user in users: 
 +        user.balance = user.aggr['amount__sum'] - max_expense 
 + 
 +    template = get_template('balance.html'
 +    variables = Context({ 
 +        'page_title':    u'Bilancio spese', 
 +        'users':         users, 
 +        'max_expense':   max_expense 
 +    }) 
 +    output = template.render(variables) 
 +    return HttpResponse(output) 
 +</code> 
 + 
 +Ecco infine il template **''my_project/templates/balance.html''** che provvede ad impaginare i dati: 
 + 
 +<code html> 
 +<html> 
 +<body> 
 +  <h1>{{page_title}}</h1> 
 +  {% if users %} 
 +    <table border="1" cellspacing="0"> 
 +      <tr> 
 +        <th>Persona</th> 
 +        <th>Numero spese</th> 
 +        <th>Somma spesa</th> 
 +        <th>Bilancio</th> 
 +      </tr> 
 +      {% for user in users %} 
 +        <tr> 
 +          <td>{{user.username}}</td> 
 +          <td>{{user.aggr.amount__count}}</td> 
 +          <td>{{user.aggr.amount__sum}}</td> 
 +          <td>{{user.balance}}</td></tr> 
 +      {% endfor %} 
 +    </table> 
 +  {% else %} 
 +    <p>No users found.</p> 
 +  {% endif %} 
 +</body> 
 +</html> 
 +</code>
 ===== Webserver di test ===== ===== Webserver di test =====
  
doc/appunti/prog/django.1309081747.txt.gz · Last modified: 2011/06/26 11:49 by niccolo