Table Of Contents

Previous topic

Installazione di Jumbo

Next topic

Object Delete - Cancellazione di un Oggetto

This Page

Object List - Implementazione Lista Oggetti e Parametri Di Ricerca

Introduzione

L’implementazione della pagina contente la lista degli oggetti di un determinato QuerySet viene fatta utilizzando le generic views offerteci da Django.

Questo un esempio di una vista che sfrutta le generic views per visualizzare una tabella dati e il relativo form per la ricerca degli stessi:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
from django.views.generic import list_detail
from jumbo.views.generic import generic_views

@login_required
def contact_list(request):
    if request.GET:
        search_form = ContactSearchForm(request.GET)
    else:
        search_form = ContactSearchForm()

    qs = generic_views.get_query_set(ContactList, search_form)

    data_list = ContactList()

    return list_detail.object_list(
        request,
        qs,
        paginate_by=20,
        template_name='organization/contact_list.html',
        extra_context={'search_form':search_form, 'data_list':data_list},
    )

Vediamo in dettaglio il funzionamento della vista.

La personalizzazione che l’utente dovra’ fare e’ rappresentata dalla creazione di due classi che descriveranno il modo in cui verranno visualizzati i dati nella tabella e il modo in cui verra’ eseguita la ricerca.

Le due classi in questione sono:

ContactSearchForm : Classe per la rappresentazione dei campi della ricerca e del relativo comportamento.

ContactList : Classe descrittiva della tabella di visualizzazione dei dati.

ContactList - Form di ricerca

Ecco un esempio di form di ricerca:

1
2
3
4
5
6
from jumbo.forms import ModelForm, ModelSearchForm

class ContactSearchForm(ModelSearchForm):
    class Meta:
        model = Contact
        fields = ('last_name', 'first_name',)

La classe dovra’ ereditare da ModelSearchForm e il suo funzionamento e’ identico ai form di Django.

Al suo interno, infatti, dovra’ essere presente una classe Meta che ne descrivera’ il comportamento.

Bisognera’ indicare su quale modello la ricerca dovra’ lavorare e i relativi campi che dovranno essere visualizzati.

Per avere maggiori dettagli sul funzionamento della ricerca fare riferimento al relativo capito ....

ContactSearchForm - Classe per la rappresentazione dei dati

Questa classe serve per descrivere in che modo i dati dovranno essere visualizzati nella tabella.

Anche in questo caso ci siamo ispirati (utilizzando anche gli stessi nomi delle variabili) al funzionamento dell’admin di Django.

Ecco un esempio di ObjectList:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
from django.conf import settings
from django.utils.translation import ugettext as _
from jumbo.core.urlresolvers import reverse

class ContactList(object):
    #object_name = _("TITOLO GRIGLIA") # Eventuale titolo da dare alla griglia, altrimento 'List NOMEMODELLO'
    list_display = ['organization', 'role', 'last_name', 'first_name', 'user', 'phone', 'mobile',
                    'fax', 'get_email_link', 'get_edit_icon', 'get_del_icon']
    sort_field = {'organization' : 'organization__name',}
    default_order_by= 'organization__name'
    model = Contact

    def get_email_link(self, result):
        return "<a href='mailto:%s'>%s</a>" % (result.email, result.email)
    get_email_link.short_description = _("Email")

    def get_edit_icon(self, result):
        return "<a href=%(reverse_url)s><img src='%(url)simg/edit.gif' alt='%(window_title)s' /></a>" % {
                                                                    'reverse_url':reverse('contact-edit', 'contact', result.id),
                                                                    'url':settings.MEDIA_URL,
                                                                    'window_title':_("Edit Contact")
                                                                }
    get_edit_icon.short_description = _("Edit")

    def get_del_icon(self, result):
        return """<a href='%(reverse_url)s' onclick=\"jshowAddAnotherPopup(this, '%(window_title)s', 500, 500, 200, 200);return false;\">
                    <img src='%(url)simg/del.png' title=\"%(window_title)s\" /></a>""" % {
                                                                    'reverse_url':reverse('contact-delete', result.id),
                                                                    'url':settings.MEDIA_URL,
                                                                    'window_title':_("Delete Contact")}
    get_del_icon.short_description = _("Del")

Le 4 variabili fondamentali sono:

list_display : campi del modello che dovranno essere visualizzati. L’ordine di visualizzazione sara’ lo stesso ordine dato ai campi nella lista.

sort_field : dizionario che rappresenta su quale campo dovra’ essere ordinato il QuerySet in base alla colonna selezionata.

default_order_by : ordinamento di default

model : modello sul quale verra’ eseguita la ricerca dei dati.

E’ possibile settare anche la variabile object_name che verra’ usata come titolo per la lista. Non e’ obbligatoria e, se non viene messa, di default il titolo della lista sara’: List Nomemodello

Per avere maggiori dettagli sulla classe di rappresentazione dei dati fare riferimento al relativo capito ....

Template di visualizzazione dei dati

La visualizzazione effettiva dei dati avviene attraverso il template template_name passato come parametro alla funzione list_detail.object_list

Note

E’ importante, anzi obbligatorio per il funzionamento generale, passare anche il dizionario extra_content con le due chiavi search_form e data_list i cui valori saranno rappresentati dai due oggetti creati sopra.

Sotto un esempio di template:

{% extends 'base.html' %}
{% load i18n result_list %}

{% block title %}{% trans 'Contact List' %}{% endblock %}

{% block js %}
    {{ block.super }}
    <script type="text/javascript">
    $(document).ready(function()
    {
      //hide the all of the element with class msg_body
      $("#search_form_body").hide();
      //toggle the componenet with class msg_body
      $("#search_form_head").click(function()
      {
        $(this).next("#search_form_body").slideToggle(500);
      });
    });
    </script>
{% endblock %}

{% block content %}
    {% if messages %}
        <ul class="messagelist">{% for message in messages %}<li>{{ message|escape }}</li>{% endfor %}</ul>
    {% endif %}

    <div id="search_form_container">
        <div id="search_form_head">
            <p>Parametri di Ricerca</p>
            <div id="icon_toggle"></div>
            <div style="clear:both"></div>
        </div>
        <div id="search_form_body">
            <form id="search_form" method="GET" action='.'>
                <table>
                    <tr>
                        <td>{{ search_form.last_name.label }}</td>
                        <td>{{ search_form.last_name }}</td>
                        <td>{{ search_form.first_name.label }}</td>
                        <td>{{ search_form.first_name }}</td>
                    </tr>
                    <tr>
                        <td>{{ search_form.organization__name.label }}</td>
                        <td>{{ search_form.organization__name }}</td>
                        <td>{{ search_form.role__name.label }}</td>
                        <td>{{ search_form.role__name }}</td>
                    </tr>
                    <tr>
                        <td><input type="submit" id="cerca" value="{% trans 'Search' %}" /></td>
                        <td><input class="res" type="reset" value="{% trans 'Clear Form' %}"></td>
                    </tr>
                </table>
            </form>
        </div>
    </div>

    <div id="objectlist">
        {% result_list data_list object_list %}
    </div>
{% endblock %}

Analizziamo le parti piu’ importanti:

{% load result_list %}

In questo modo carichiamo il templatetag che servira’ per stampare a video la tabella dei dati.

{% block js %}
    {{ block.super }}
    <script type="text/javascript">
    $(document).ready(function()
    {
      //hide the all of the element with class msg_body
      $("#search_form_body").hide();
      //toggle the componenet with class msg_body
      $("#search_form_head").click(function()
      {
        $(this).next("#search_form_body").slideToggle(500);
      });
    });
    </script>
{% endblock %}

Questo codice javascript chiudera’ di default il div dei parametri di ricerca e abilita la transazione per far apparire/nascondere il div stesso.

Togliendo questo blocco il div verra’ comunque renderizzato ma verra’ visualizzato semrpe aperto.

<div id="objectlist">
    {% result_list data_list object_list %}
</div>

In questo modo chiamamo il templatetag di visualizzazione della tabella. I due parametri da passare sono il data_list e l’object_list, cioe’ le due famose chiavi passate nel dizionario extra_content