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 :

Get field by name


Sujet :

Django Python

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Profil pro
    Inscrit en
    Novembre 2008
    Messages
    16
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2008
    Messages : 16
    Par défaut Get field by name
    Bonjour,

    Je l'habitude de développer avec symfony(php), mais j'ai voulu tester Django.

    Je voudrai savoir si dans un modèle django on peut récupéré la valeur d'un champ par son nom (ex.: modele.getfielbyname()) pour afficher sa valeur dans le template.

    Je sais que avec python on peut utiliser la fonction : getattr(object, name).

    Mais cette fonction n'est pas utilisable dans les templates Django et généré des erreurs.

    Merci.

  2. #2
    Membre très actif
    Avatar de afranck64
    Homme Profil pro
    Étudiant
    Inscrit en
    Janvier 2009
    Messages
    592
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 34
    Localisation : Cameroun

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Janvier 2009
    Messages : 592
    Par défaut
    Salut,
    Il faut se servir du point (.) comme dans un code Python normal.
    Si tu as un objet X et veux accéder à son champ c1:
    Si <c1> est une méthode, elle ne dois pas prendre de paramètre.

    Dans le cas de listes
    Dans le cas des dicos:
    Win 10 64 bits / Linux Mint 18, - AMD A6 Quad: Py27 / Py35
    CONTENU D'UNE QUESTION
    Exemples:
    - Configuration (système d'exploitation, version de Python et des bibliothèques utilisées)
    - Code source du morceau de programme où il y a un bogue
    - Ligne de code sur laquelle le bogue apparaît
    - Erreur complète retournée pas l'interpréteur Python
    - Recherche déjà effectuée (FAQ, Tutoriels, ...)
    - Tests déjà effectués

  3. #3
    Membre averti
    Profil pro
    Inscrit en
    Novembre 2008
    Messages
    16
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2008
    Messages : 16
    Par défaut
    Merci, mais ça marche pas

    Mon fichier views.py contiens :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    def homepage(request):
        from django.db import connection
        charnom = "nom"
        patients = Patient.objects.all()
        return render_to_response('patient/lst_patient.html',
                              locals(),
                              context_instance=RequestContext(request))
    et le template :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    <div>{{ patient.charnom }}</div>
            <div>{{ patient.nom }}</div>
    	<div>{{ charnom }}</div>
    Cela me génére une page :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    <div></div>
    <div>toto</div>
    <div>nom</div>
    "{{ patient.charnom }}" n'affiche rien

  4. #4
    Membre confirmé
    Homme Profil pro
    Développeur Web
    Inscrit en
    Mars 2008
    Messages
    21
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Puy de Dôme (Auvergne)

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : Associations - ONG

    Informations forums :
    Inscription : Mars 2008
    Messages : 21
    Par défaut
    tu y es presque...

    "patient" au singulier n'existe pas dans ta vue, essaie de modifier ton template comme ça :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    {% for patient in patients %}
     
    ...ton code template...
     
    {% endfor %}

  5. #5
    Membre averti
    Profil pro
    Inscrit en
    Novembre 2008
    Messages
    16
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2008
    Messages : 16
    Par défaut
    Bonjour,

    J'apprécie vraiment votre volonté de répondre n'importe quoi...

    Comme dit un ancien proverbe: on n'est jamais mieux servi que par soi-même.
    Donc j'ai trouvé la réponse moi-même. Ceux qui sont interessés la voici :

    Il faut créer un filter personnalisé. Pour cela il faut créer le dossier appelé "templatetags" dans le dossier de votre application. Vous pouvez créer une application qui ne fait rien et créer ce dossier à l'intérieur de cette application votre filtre serra utilisé par toutes les applications existantes dans votre projet. Comme ça vous pourrez utiliser cette application dans un autre de vos projet.
    Dans le dossier "templatetags" il faut créer 2 fichiers:
    __init__.py
    nomquevousvouler.py

    Laissez "__init__.py" vide et dans "nomquevousvouler.py" mettez :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    from django import template
     
    register = template.Library()
     
    @register.filter
    def get(object,attrname):
        """
        get attribut from object
        @return attribut or null
        """
        return getattr(object, attrname, None)
    Maintenant, vous pouvez utiliser le filtre "get" dans vos templates de la sorte :
    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
    {% extends "base.html" %}
    {% load get %}
    {% block title %}Liste des patients{% endblock %}
    {% block content %}
    <table>
        <thead>
            <tr>
            {% for field in fields %}
                <th>{{ field.verbose_name }}</th>
            {% endfor %}
            </tr>
        </thead>
        <tbody>
            <tr>
            {% for patient in patients %}
                {% for field in fields %}
                <td>{{ patient|get:field.name }} </td>
                {% endfor %}
            {% endfor %}
            </tr>
        </tbody>
    </table>
    {% endblock %}
    Comme je suis sympa je vous donne mon fichier views.py :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    # -*- coding: utf-8 -*-
    from django.shortcuts import render_to_response
    from django.template import RequestContext
    from models import Patient
     
    def homepage(request):
        from django.db import connection
        charnom="nom"
        patients = Patient.objects.all()
        fields = Patient._meta.fields

  6. #6
    Membre très actif
    Avatar de afranck64
    Homme Profil pro
    Étudiant
    Inscrit en
    Janvier 2009
    Messages
    592
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 34
    Localisation : Cameroun

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Janvier 2009
    Messages : 592
    Par défaut
    J'apprécie vraiment votre volonté de répondre n'importe quoi...
    On peut dire que vous au moins, vous savez redonner du moral aux troupes.

    Avez-vous au moins tenu compte des écrits de quinode?
    La vous le faite et ça marche: <field.verbose_name>
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    ...
        <thead>
            <tr>
            {% for field in fields %}
                <th>{{ field.verbose_name }}</th>
            {% endfor %}
            </tr>
        </thead>
    ...
    Pourquoi n'en avoir pas fait autant ici?
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    ...
        <tbody>
            <tr>
            {% for patient in patients %}
                {% for field in fields %}
                <td>{{ patient|get:field.name }} </td>
                {% endfor %}
            {% endfor %}
            </tr>
        </tbody>
    ...
    ===>
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    ...
        <tbody>
            <tr>
            {% for patient in patients %}
                {% for field in fields %}
                <td>{{ patient.name }} </td>
                {% endfor %}
            {% endfor %}
            </tr>
        </tbody>
    ...
    Win 10 64 bits / Linux Mint 18, - AMD A6 Quad: Py27 / Py35
    CONTENU D'UNE QUESTION
    Exemples:
    - Configuration (système d'exploitation, version de Python et des bibliothèques utilisées)
    - Code source du morceau de programme où il y a un bogue
    - Ligne de code sur laquelle le bogue apparaît
    - Erreur complète retournée pas l'interpréteur Python
    - Recherche déjà effectuée (FAQ, Tutoriels, ...)
    - Tests déjà effectués

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

Discussions similaires

  1. Linux get pid from name langage C
    Par ElFenec dans le forum Linux
    Réponses: 8
    Dernier message: 27/01/2010, 08h02
  2. Content Type et Field Name
    Par zghidi dans le forum SharePoint
    Réponses: 3
    Dernier message: 14/01/2008, 14h37
  3. remplir un Field Name
    Par khorn dans le forum Access
    Réponses: 38
    Dernier message: 26/10/2006, 14h49
  4. Ambiguous field name
    Par sondo dans le forum Bases de données
    Réponses: 2
    Dernier message: 17/07/2006, 18h06

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