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 :

[DJANGO]Templates, tag et égalité


Sujet :

Django Python

  1. #1
    Membre à l'essai
    Homme Profil pro
    Inscrit en
    Octobre 2013
    Messages
    22
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Octobre 2013
    Messages : 22
    Points : 11
    Points
    11
    Par défaut [DJANGO]Templates, tag et égalité
    Bonjour!

    Je suis confronté à un problème dans mon utilisation de Django.

    Je souhaiterai dans mes templates faire des tests et vérifier si des variables sont égales ou égales à des chaînes de caractères. Voici un exemple que j'utilise pour un site web. J'ai une BDD avec des utilisateurs, une autre avec des communautés. Ces deux bases sont liées entre elles via une troisième appelée Rejoindre. Dans celle-ci je stocke différentes données qui me permettent d'avoir des informations sur l'utilisateur et la communauté.

    Mon fichier models.py:
    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
    class Communaute(models.Model):
        nom=models.CharField(max_length=50, verbose_name="Nom de la communauté", unique=True)   #nom de la communauté
        description=models.TextField(blank=True, verbose_name="Description")
        TYPE_COMMUNAUTE=(
            ('PUBLIQUE','Publique'),
            ('PRIVEE','Privée'),
        )
        type_communaute=models.CharField(max_length=50, verbose_name="Type de la communauté", choices=TYPE_COMMUNAUTE)
        inscriptionauto=models.BooleanField(default=False, verbose_name="Inscription automatique")
        membres=models.ManyToManyField(User, through='Rejoindre', verbose_name="Communaute", null=True, blank=True)
        def __unicode__(self):
            return self.nom
     
    class Rejoindre(models.Model):
        createur = models.BooleanField(default=False, verbose_name="Créateur de la communaute")
        date = models.DateTimeField(auto_now_add=True, auto_now=False,verbose_name="Rejoins depuis le:")
        user = models.ForeignKey(User)
        communaute=models.ForeignKey(Communaute)
        postuler=models.BooleanField(default=False, verbose_name="La personne a t'elle postulée")
        refuser=models.BooleanField(default=False, verbose_name="La personne est elle refusée")
        def __unicode__(self):
            return "Communauté: {0}".format(self.communaute.nom)
    Je souhaiterai afficher un tableau avec l'ensemble des communautés existantes en indiquant différentes informations, dont le nom du créateur. Le champs Rejoindre.createur est à True pour le user qui est le créateur. J'espère que c'est assez clair... Pour la partie templates, la voici:

    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
     
    <tr>
            <th>Nom de la communauté</th>
            <th>Type</th>
            <th>Nombre de membre</th>
            <th>Créateur</th>
        </tr>
        {% for communaute in communautes %}
        <tr>
            <td><a id="lien_site" href="/communaute/num-{{communaute.id}}">{{ communaute.nom }}</a></td>
            <td>{{communaute.type_communaute}}</td>
            <td>{{communaute.membres.all|length}} membre{{ communaute.membres.all|pluralize }}</td>
            <td>
                {% for membre in communaute.membres.all %}
                    {% if membre.rejoindre.createur=True %}
                        {{membres.username}}
                    {% endif %}
                {% endfor %}
            </td>
        </tr>
        {% endfor %}
    </table>
    Et bien sur, ça merde... Tout le tableau fonctionne, sauf la colonne créateur (j'ai tester sans mettre le if avec createur=True).

    Pour vous aider je mets le message d'erreur que j'ai :
    TemplateSyntaxError at /communaute/chercher-communaute/
    Could not parse the remainder: '=True' from 'membre.rejoindre.createur=True'

    Merci pour votre aide !

  2. #2
    Membre averti
    Profil pro
    Inscrit en
    Mai 2006
    Messages
    290
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2006
    Messages : 290
    Points : 426
    Points
    426
    Par défaut
    Bonjour,

    Essayez avec
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    {% if membre.rejoindre.createur == True %}
    ou mieux

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    {% if membre.rejoindre.createur %}

  3. #3
    Membre à l'essai
    Homme Profil pro
    Inscrit en
    Octobre 2013
    Messages
    22
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Octobre 2013
    Messages : 22
    Points : 11
    Points
    11
    Par défaut
    Bonjour et merci de tes réponses !

    Malheureusement les solutions proposées ne fonctionne pas. Lorsque je mets
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    {% if membre.rejoindre.createur == True %}
    (ou en mettant == "true", == "True", == true ...) j'ai toujours le même message d'erreur.
    Je ne pense pas qu'il est possible de tester la valeur d'un champs de cette façon...
    Lorsque je mets
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    {% if membre.rejoindre.createur %}
    rien ne se passe et mon templates n’exécute même pas le code qui est après. Je n'ai par contre aucun message d'erreur. J'ai pourtant vérifier, j'ai bien un champs à True dans membre.rejoindre.createur
    ... je suis toujours bloqué !

  4. #4
    Membre averti
    Profil pro
    Inscrit en
    Mai 2006
    Messages
    290
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2006
    Messages : 290
    Points : 426
    Points
    426
    Par défaut
    Cela vient de votre modèle... Vous ne devez pas pouvoir accéder à "rejoindre" à partir de "membre" (qui est un User).

    Ce que je peux vous conseiller en tout cas c'est de limiter le code d'accès aux modèles dans votre template. Ce sera plus simple à tester s'il est dans votre views.py.

  5. #5
    Membre à l'essai
    Homme Profil pro
    Inscrit en
    Octobre 2013
    Messages
    22
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Octobre 2013
    Messages : 22
    Points : 11
    Points
    11
    Par défaut
    Bonjour

    Ce que je peux vous conseiller en tout cas c'est de limiter le code d'accès aux modèles dans votre template. Ce sera plus simple à tester s'il est dans votre views.py.
    En principe j'essaye d'appliquer cela mais parfois je me retrouve bloquer, du moins je ne sais pas comment faire.
    Lorsque je souhaite afficher un tableau avec plusieurs éléments d'un modèle (réalisation d'une boucle for in dans le template) et pour chaque élément de la boucle je souhaite afficher une information liée à une autre table ayant pour clé l'élément du modèle, comment je fais?
    Je ne sais pas si ma demande est claire...
    En d'autre terme, je souhaite afficher dans ce cas là le nom du créateur de la communauté, via la table "Rejoindre".

  6. #6
    Membre averti Avatar de Stopher
    Homme Profil pro
    Responsable technique
    Inscrit en
    Juin 2004
    Messages
    198
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : France, Nord (Nord Pas de Calais)

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

    Informations forums :
    Inscription : Juin 2004
    Messages : 198
    Points : 446
    Points
    446
    Par défaut
    salut,
    si j'ai bien saisi ton problème, tu souhaites accéder à la valeur d'un tableau via une clef "dynamique" dans le template.

    si c'est le cas , ce n'est pas possible directement , il faut que tu passes par un filtre dédié.

    voici un exemple qui répond à cette problématique :

    http://stackoverflow.com/questions/8...ango-templates

    ch.

  7. #7
    Membre à l'essai
    Homme Profil pro
    Inscrit en
    Octobre 2013
    Messages
    22
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Octobre 2013
    Messages : 22
    Points : 11
    Points
    11
    Par défaut
    Bonjour.

    J'ai regardé en détail le lien que tu m'as envoyé... si je comprend bien je dois créer un tag perso...

    Je n'ai encore jamais créé de tag personnel, je regarde sur la doc et je test cela.
    J'espère être capable de trouver ! (sinon je reviens à la charge ^^)

    En tout cas merci de ton lien !

  8. #8
    Membre averti Avatar de Stopher
    Homme Profil pro
    Responsable technique
    Inscrit en
    Juin 2004
    Messages
    198
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : France, Nord (Nord Pas de Calais)

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

    Informations forums :
    Inscription : Juin 2004
    Messages : 198
    Points : 446
    Points
    446
    Par défaut
    J'ai regardé en détail le lien que tu m'as envoyé... si je comprend bien je dois créer un tag perso...
    C'est ça,

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    Je n'ai encore jamais créé de tag personnel, je regarde sur la doc et je test cela.
    J'espère être capable de trouver ! (sinon je reviens à la charge ^^)
    C'est plutôt simple,
    tu crées un répertoire nommé templatetags au même niveau que ton répertoire templates

    NB: ne pas oublier de créer le fichier __init__.py à l'intérieur ( c'est un module )

    Puis à l'intérieur, tu y ajoute ton filtre ex : mon_premier_filtre.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 import template
     
    register = template.Library()
     
    @register.filter(name='monfiltre')
    def lookup(d, key):
        return d[key]
    Voilà, et dans le template ou tu dois l'utiliser :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    #Ici c'est le nom du fichier qui est utilisé pour charger le filtre 
    {% load mon_premier_filtre %}
     
    #retourne la valeur de mylist[x]
    {{ mylist|monfiltre:x }}
    Si ça t’intéresse, j'avais commencé une doc sur la mise en place d'un projet Django , une sorte de doc avec des recettes toutes faites

    Sinon la doc Django pour les tags perso : https://docs.djangoproject.com/en/1....template-tags/

  9. #9
    Membre à l'essai
    Homme Profil pro
    Inscrit en
    Octobre 2013
    Messages
    22
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Octobre 2013
    Messages : 22
    Points : 11
    Points
    11
    Par défaut
    Bonjour

    Après plusieurs essai non concluant je reviens sur le forum pour reparler de ce point (je ne supporte pas de ne pas arriver à mes fins).

    J'ai donc créé un filtre dans le fichier communaute\templatetags\filtre.py:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    #-*- coding:utf-8-*-
    from django import template
     
    register = template.Library()
     
    @register.filter(name='affichage_createur')
    def lookup(d, key):
        return d[key]
    Ensuite dans mon communaute\views.py je fais l'oppération suivante pour sélectionner les créateurs :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    createur=JournalInscription.objects.filter(createur=True)
    Et pour finir dans mon templates :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    {% load filtre %}
    {{createur|affichage_createur:x }}
    Mais j'ai le message d'erreur suivant:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    ariableDoesNotExist at /communaute/chercher-communaute/
     
    Failed lookup for key [x] in "[{'False': False, 'None': None, 'True': True}, {'csrf_token': <django.utils.functional.lazy.<locals>.__proxy__ object at 0x02B84890>}, {'perms': <django.contrib.auth.context_processors.PermWrapper object at 0x02B1D350>, 'user': <django.utils.functional.SimpleLazyObject object at 0x02B1D390>}, {}, {'LANGUAGES': (('af', 'Afrikaans'), ('ar', 'Arabic'), ('az', 'Azerbaijani'), ('bg', 'Bulgarian'), ('be', 'Belarusian'), ('bn', 'Bengali'), ('br', 'Breton'), ('bs', 'Bosnian'), ('ca', 'Catalan'), ('cs', 'Czech'), ('cy', 'Welsh'), ('da', 'Danish'), ('de', 'German'), ('el', 'Greek'), ('en', 'English'), ('en-gb', 'British English'), ('eo', 'Esperanto'), ('es', 'Spanish'), ('es-ar', 'Argentinian Spanish'), ('es-mx', 'Mexican Spanish'), ('es-ni', 'Nicaraguan Spanish'), ('es-ve', 'Venezuelan Spanish'), ('et', 'Estonian'), ('eu', 'Basque'), ('fa', 'Persian'), ('fi', 'Finnish'), ('fr', 'French'), ('fy-nl', 'Frisian'), ('ga', 'Irish'), ('gl', 'Galician'), ('he', 'Hebrew'), ('hi', 'Hindi'), ('hr', 'Croatian'), ('hu', 'Hungarian'), ('ia', 'Interlingua'), ('id', 'Indonesian'), ('is', 'Icelandic'), ('it', 'Italian'), ('ja', 'Japanese'), ('ka', 'Georgian'), ('kk', 'Kazakh'), ('km', 'Khmer'), ('kn', 'Kannada'), ('ko', 'Korean'), ('lb', 'Luxembourgish'), ('lt', 'Lithuanian'), ('lv', 'Latvian'), ('mk', 'Macedonian'), ('ml', 'Malayalam'), ('mn', 'Mongolian'), ('nb', 'Norwegian Bokmal'), ('ne', 'Nepali'), ('nl', 'Dutch'), ('nn', 'Norwegian Nynorsk'), ('pa', 'Punjabi'), ('pl', 'Polish'), ('pt', 'Portuguese'), ('pt-br', 'Brazilian Portuguese'), ('ro', 'Romanian'), ('ru', 'Russian'), ('sk', 'Slovak'), ('sl', 'Slovenian'), ('sq', 'Albanian'), ('sr', 'Serbian'), ('sr-latn', 'Serbian Latin'), ('sv', 'Swedish'), ('sw', 'Swahili'), ('ta', 'Tamil'), ('te', 'Telugu'), ('th', 'Thai'), ('tr', 'Turkish'), ('tt', 'Tatar'), ('udm', 'Udmurt'), ('uk', 'Ukrainian'), ('ur', 'Urdu'), ('vi', 'Vietnamese'), ('zh-cn', 'Simplified Chinese'), ('zh-tw', 'Traditional Chinese')), 'LANGUAGE_BIDI': False, 'LANGUAGE_CODE': 'fr-FR'}, {'MEDIA_URL': ''}, {'STATIC_URL': '/statics/'}, {'TIME_ZONE': 'Paris, Madrid'}, {'messages': <django.contrib.messages.storage.fallback.FallbackStorage object at 0x02B1D910>}, {'createur': [<JournalInscription: JournalInscription object>, <JournalInscription: JournalInscription object>], 'form': <communaute.forms.CommunauteChercherForm object at 0x02B1DB50>, 'utilisateur': <django.utils.functional.SimpleLazyObject object at 0x02B1D390>, 'communautes': [<Communaute: Communaute object>, <Communaute: Communaute object>]}]"
     
    Request Method: 	GET
    Request URL: 	http://localhost:8000/communaute/chercher-communaute/
    Django Version: 	1.5.4
    Exception Type: 	VariableDoesNotExist
    Exception Value: 	
     
    Failed lookup for key [x] in "[{'False': False, 'None': None, 'True': True}, {'csrf_token': <django.utils.functional.lazy.<locals>.__proxy__ object at 0x02B84890>}, {'perms': <django.contrib.auth.context_processors.PermWrapper object at 0x02B1D350>, 'user': <django.utils.functional.SimpleLazyObject object at 0x02B1D390>}, {}, {'LANGUAGES': (('af', 'Afrikaans'), ('ar', 'Arabic'), ('az', 'Azerbaijani'), ('bg', 'Bulgarian'), ('be', 'Belarusian'), ('bn', 'Bengali'), ('br', 'Breton'), ('bs', 'Bosnian'), ('ca', 'Catalan'), ('cs', 'Czech'), ('cy', 'Welsh'), ('da', 'Danish'), ('de', 'German'), ('el', 'Greek'), ('en', 'English'), ('en-gb', 'British English'), ('eo', 'Esperanto'), ('es', 'Spanish'), ('es-ar', 'Argentinian Spanish'), ('es-mx', 'Mexican Spanish'), ('es-ni', 'Nicaraguan Spanish'), ('es-ve', 'Venezuelan Spanish'), ('et', 'Estonian'), ('eu', 'Basque'), ('fa', 'Persian'), ('fi', 'Finnish'), ('fr', 'French'), ('fy-nl', 'Frisian'), ('ga', 'Irish'), ('gl', 'Galician'), ('he', 'Hebrew'), ('hi', 'Hindi'), ('hr', 'Croatian'), ('hu', 'Hungarian'), ('ia', 'Interlingua'), ('id', 'Indonesian'), ('is', 'Icelandic'), ('it', 'Italian'), ('ja', 'Japanese'), ('ka', 'Georgian'), ('kk', 'Kazakh'), ('km', 'Khmer'), ('kn', 'Kannada'), ('ko', 'Korean'), ('lb', 'Luxembourgish'), ('lt', 'Lithuanian'), ('lv', 'Latvian'), ('mk', 'Macedonian'), ('ml', 'Malayalam'), ('mn', 'Mongolian'), ('nb', 'Norwegian Bokmal'), ('ne', 'Nepali'), ('nl', 'Dutch'), ('nn', 'Norwegian Nynorsk'), ('pa', 'Punjabi'), ('pl', 'Polish'), ('pt', 'Portuguese'), ('pt-br', 'Brazilian Portuguese'), ('ro', 'Romanian'), ('ru', 'Russian'), ('sk', 'Slovak'), ('sl', 'Slovenian'), ('sq', 'Albanian'), ('sr', 'Serbian'), ('sr-latn', 'Serbian Latin'), ('sv', 'Swedish'), ('sw', 'Swahili'), ('ta', 'Tamil'), ('te', 'Telugu'), ('th', 'Thai'), ('tr', 'Turkish'), ('tt', 'Tatar'), ('udm', 'Udmurt'), ('uk', 'Ukrainian'), ('ur', 'Urdu'), ('vi', 'Vietnamese'), ('zh-cn', 'Simplified Chinese'), ('zh-tw', 'Traditional Chinese')), 'LANGUAGE_BIDI': False, 'LANGUAGE_CODE': 'fr-FR'}, {'MEDIA_URL': ''}, {'STATIC_URL': '/statics/'}, {'TIME_ZONE': 'Paris, Madrid'}, {'messages': <django.contrib.messages.storage.fallback.FallbackStorage object at 0x02B1D910>}, {'createur': [<JournalInscription: JournalInscription object>, <JournalInscription: JournalInscription object>], 'form': <communaute.forms.CommunauteChercherForm object at 0x02B1DB50>, 'utilisateur': <django.utils.functional.SimpleLazyObject object at 0x02B1D390>, 'communautes': [<Communaute: Communaute object>, <Communaute: Communaute object>]}]"
    Je pense que le problème viens du fait que
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    createur=JournalInscription.objects.filter(createur=True)
    n'est pas une liste...

    J'ai pourtant essayé cela :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    createur=JournalInscription.objects.filter(createur=True).user
    et
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    createur=JournalInscription.objects.filter(createur=True).user.username
    Mais cela ne fonctionne pas:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    'QuerySet' object has no attribute 'user'
    Bref je suis au point de départ

Discussions similaires

  1. Date en argument du tag url dans un template
    Par Heliodromel dans le forum Django
    Réponses: 5
    Dernier message: 26/08/2009, 15h48
  2. Réponses: 2
    Dernier message: 20/05/2008, 10h03
  3. Templates, pointeurs et égalités
    Par Romaincb dans le forum C++
    Réponses: 9
    Dernier message: 12/03/2007, 09h58
  4. Velocity Template/Tag library : comparaison ?
    Par joseph_p dans le forum Développement Web en Java
    Réponses: 2
    Dernier message: 09/11/2005, 13h47

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