IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Django Python Discussion :

Affichage de données


Sujet :

Django Python

  1. #1
    Invité
    Invité(e)
    Par défaut Affichage de données
    Bonjours à tous
    Je vous explique la situation.
    Dans mon fichier models.py j'ai créé les objets suivants :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
    class Site(models.Model):
        nom = models.CharField('Nom du site', max_length=200)
        adresse = models.CharField('Adresse ', max_length=200)
        siteinternet = models.URLField('URL du site', max_length=200)
     
    class Image(models.Model):
        site = models.ForeignKey(Site) 
        nom = models.CharField('Nom de l\'image', max_length=200)
        localisation = models.ImageField('Image', upload_to = 'images/')
    J'ai créer une vue générique dans mon fichier urls.py qui me permet d'afficher les informations d'un site en utilisant le code suivant :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
     
    # -*- coding: utf-8 -*-
    from django.conf.urls.defaults import *
    from AppliWeb.tourisme.models import Site, Image
    from django.views.generic import *
     
    #Dictionnaire de donnees
    dict_site = {'queryset': Site.objects.all().order_by('nom')}
     
    urlpatterns += patterns('django.views.generic',
         (r'^site/(?P<object_id>\d+)/$', 'list_detail.object_detail', dict(dict_site, template_name = "tourisme/site/site_detail.html"), id),
    Je ne vais pas mettre le code de ma template site_detail.html car il n'y a rien de sorcier c'est uniquement des balises html avec un ensemble de tags et variables.
    Maintenant ce que je souhaites faire c'est afficher les images rattachées au site à la suite des informations de ce même site et sous forme de liens hypertextes.
    Ce lien permettra par la suite d'afficher l'image dans un nouvel onglet.

    Ma question est la suivante : est-ce que je peux utiliser une vue générique ou faut-il déclarer une vue "simple" dans mon fichier views.py?
    Si c'est une vue simple comment posséder?

    Je me suis renseigner sur le QuerySet API reference mais je vois pas comment faire.
    Merci d'avance pour votre aide.

  2. #2
    Membre émérite
    Avatar de DelphiManiac
    Homme Profil pro
    Homme à tout faire
    Inscrit en
    Mars 2002
    Messages
    1 147
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 60
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Homme à tout faire
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mars 2002
    Messages : 1 147
    Points : 2 533
    Points
    2 533
    Par défaut
    Salut,

    Ton objet model te permets de parcourir les tables liées par <le nom du champ>_set.all().

    Dans ton cas : site.image_set.all() (quand c'est dans du code python).

    Pour ton besoin, c'est à dire dans le template, tu auras quelque chose dans le style de :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    {% for s in site %}
        <a href="{{ s.siteinternet }}">{{ s.nom }}</a>
        <p>{{ s.adresse }}</p>
        {% for i in site__image_set.all %}
            <p>{{ i.nom }}</p>
            <img src="{{ i.localisation }}" />
        {% endfor %}
    {% endif %}
    La doc est ici : http://docs.djangoproject.com/en/dev...ships-backward




    Et installes toi si ce n'est déjà fait le module admindocs. Cela te permets de voir tes modèles ainsi que leurs attributs à partir de la console d'administration.

    Tu trouveras un commentaire dans ton fichier urls.py principal. Il faut que tu installes le package docutils aussi.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
        # Uncomment the admin/doc line below and add 'django.contrib.admindocs'
        # to INSTALLED_APPS to enable admin documentation:    # (r'^admin/doc/', include('django.contrib.admindocs.urls')),
    P.S.: J'ai donné l'exemple du template sans le tester, possible qu'il y ai des erreurs, mais l'idée est là.
    Si ce message vous a semblé utile, il est possible qu'il soit utile à d'autres personnes. Pensez au . Et n'oubliez pas le le moment venu !

    On n'a pas à choisir si l'on est pour ou contre la décroissance, elle est inéluctable, elle arrivera qu'on le veuille ou non.

  3. #3
    Invité
    Invité(e)
    Par défaut
    Merci pour ta réponse DelphiManiac
    J'essaye ce que tu viens de me donner et je te dis si ça fonctionne

  4. #4
    Invité
    Invité(e)
    Par défaut
    Alors j'ai laissé tombé la vue générique que j'ai décrite plus haut pour appeler une fonction toute simple :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    def site_detail(request, site_id):
        site = Site.objects.filter(id__exact=site_id)
        return render_to_response("tourisme/site/site_detail.html", {'site': site})
    J'ai essayé d'intégrer le code qui m'intéressait que tu m'a donné dans ma template "site_detail.html" à savoir :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
        {% for i in site__image_set.all %}
            <p>{{ i.nom }}</p>
            <img src="{{ i.localisation }}" />
        {% endfor %}
    J'ai bien vérifié les noms de champ dans mes models mais rien à faire.
    Aurais-je oublié quelque chose dans ma fonction site_detail ?

  5. #5
    Membre émérite
    Avatar de DelphiManiac
    Homme Profil pro
    Homme à tout faire
    Inscrit en
    Mars 2002
    Messages
    1 147
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 60
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Homme à tout faire
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mars 2002
    Messages : 1 147
    Points : 2 533
    Points
    2 533
    Par défaut
    Tu as du te tromper sur :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    site = Site.objects.filter(id__exact=site_id)
    Ceci te permets de récupérer une liste d'objet dont la condition est valide. Ce qui signifie que tu récupères dans ce cas une liste de 1 objet.

    Quand tu ne veux lire qu'un seul objet, utilises :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    site = Site.objets.get(id__exact=site_id).
    Sur une table que j'ai, cela donne par exemple :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    >>> News.objects.filter(id__exact = 4)
    [<News: Jake White, Consultant du Rugby Club Toulonnais !>]
    >>> News.objects.get(id__exact = 4)
    <News: Jake White, Consultant du Rugby Club Toulonnais !>
    Le premier renvoi [<...>], c'est une liste de news, le 2ième renvoi : <...> c'est une seule news.

    Donc soit c'est une liste et tu dois parcourir ta liste dans ton template :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    {% for s in site %}
        {% for i in s__image_set.all %}
            <p>{{ i.nom }}</p>
            <img src="{{ i.localisation }}" />
        {% endfor %}
    {% endfor %}
    soit c'est un objet seul et ton template devrait fonctionner.

    Il est for possible que le problème que tu as rencontré sur ta vue générique soit de la même origine. Le template que je t'avais donné correspondait à une vue générique de liste et non le détail d'un objet.
    Si ce message vous a semblé utile, il est possible qu'il soit utile à d'autres personnes. Pensez au . Et n'oubliez pas le le moment venu !

    On n'a pas à choisir si l'on est pour ou contre la décroissance, elle est inéluctable, elle arrivera qu'on le veuille ou non.

  6. #6
    Invité
    Invité(e)
    Par défaut
    Justement ce qui m'intéresse c'est la template dans le cas d'un détail et non d'une liste car le morceau de template que tu m'a donné plus haut ne fonctionne pas.
    Ce que je souhaite c'est afficher le détail d'un site (jusque là je suis capable de le faire) et je voudrais greffer la liste des images qui sont rattachées à ce site.
    Ensuite avec un lien hypertexte sur le nom je pourrais afficher l'image correspondante dans un autre onglet de mon navigateur.

  7. #7
    Membre émérite
    Avatar de DelphiManiac
    Homme Profil pro
    Homme à tout faire
    Inscrit en
    Mars 2002
    Messages
    1 147
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 60
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Homme à tout faire
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mars 2002
    Messages : 1 147
    Points : 2 533
    Points
    2 533
    Par défaut
    Et avec les informations précédentes que je t'ai donné, ca ne marche pas ??

    Si tu n'y arrives pas, poste ici ton template complet actuel et ton modèle de données s'il a changé depuis le début.
    Si ce message vous a semblé utile, il est possible qu'il soit utile à d'autres personnes. Pensez au . Et n'oubliez pas le le moment venu !

    On n'a pas à choisir si l'on est pour ou contre la décroissance, elle est inéluctable, elle arrivera qu'on le veuille ou non.

  8. #8
    Invité
    Invité(e)
    Par défaut
    Alors mon modèle de donnée est identique a celui posté au début voici ma template :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    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
    32
    33
    34
     
    {% block content %}
    	{% if site %}
    		<h1>Detail du site <strong>{{ site.nom }}</strong></h1>
     
    		<!-- Adresse du site --> 
    		<h3>Adresse</h3>
    		<p>{{ site.adresse1 }}</p>
    		{% if site.adresse2  %}
    			<p>{{ site.adresse2 }}</p>
    		{% endif %}	
    		<p>{{ site.commune }}</p>
     
    		<!-- Informations supplémentaires --> 
    		<h3>Informations complémentaires</h3>
    		<p>Téléphone : {{ site.telephone }}</p>
    		<p>Fax : {{ site.facsimile }}</p>
    		<p>Email : {{ site.courriel }}</p>
    		<p>Site Internet : {{ site.siteinternet }}</p>
     
    		<!-- Coordonnées Google Maps --> 
    		<h3>Coordonnées Google Maps</h3>
    		<p>Latitude : {{ site.latitude }}</p>
    		<p>Longitude : {{ site.longitude }}</p>
     
    		<h3>Images du site</h3>
    		    {% for i in site__image_set.all %}
    		        <p>{{ i.nom }}</p>
    		        <img src="{{ i.localisation }}" />
    		    {% endfor %}
    	{% else %}
    		<h2>Aucun site disponible.</h2>
    	{% endif %}
    {% endblock %}
    Je te remet la fonction que j'appelle de mon fichier views.py :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    def site_detail(request, site_id): 
        site = Site.objects.get(id=site_id) 
        return render_to_response("tourisme/site/site_detail.html", {'site': site})
    PS : Mon modele Site que j'ai saisie plus haut a été simplifié donc ne fait pas au champs que je déclare dans ma template et qui ne sont pas présent dans le modèle Site ci-dessus

  9. #9
    Membre émérite
    Avatar de DelphiManiac
    Homme Profil pro
    Homme à tout faire
    Inscrit en
    Mars 2002
    Messages
    1 147
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 60
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Homme à tout faire
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mars 2002
    Messages : 1 147
    Points : 2 533
    Points
    2 533
    Par défaut
    Arg désolé, c'est moi qui t'ai induit en erreur :/

    A la place de
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    {% for i in site__image_set.all %}
    c'est
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    {% for i in site.image_set.all %}
    La première syntaxe avec les __ est celle à utiliser pour les tables liées mais dans les filtres de queryset.
    Si ce message vous a semblé utile, il est possible qu'il soit utile à d'autres personnes. Pensez au . Et n'oubliez pas le le moment venu !

    On n'a pas à choisir si l'on est pour ou contre la décroissance, elle est inéluctable, elle arrivera qu'on le veuille ou non.

  10. #10
    Invité
    Invité(e)
    Par défaut
    Ouais c'est bon ça marche
    En revanche le champ
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    <img src="{{ i.localisation }}" />
    ne fonctionne pas mais c'est surement une erreur de syntaxe je vais me renseigner.
    Merci pour tout DelphiManiac

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Affichage de données en OpenGL
    Par bennnun dans le forum OpenGL
    Réponses: 6
    Dernier message: 10/05/2005, 02h34
  2. TDBCtrlGrid - Affichage des données
    Par audreyb dans le forum Bases de données
    Réponses: 1
    Dernier message: 24/10/2004, 13h10
  3. [JTable] Problème d'affichage des données
    Par ddams dans le forum Composants
    Réponses: 2
    Dernier message: 15/09/2004, 17h07
  4. Affichage de données (histograme, graphe etc.)
    Par sunshine33 dans le forum Autres Logiciels
    Réponses: 11
    Dernier message: 13/01/2004, 14h16
  5. PB : affichage de données avec accent sous delphi 6
    Par kinda dans le forum Débuter
    Réponses: 3
    Dernier message: 03/07/2003, 13h19

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo