Forum Programmation.python Django : accéder à un dictionnaire via une variable

Posté par  (site web personnel) .
Étiquettes : aucune
0
30
mai
2008
Bonjour,

j'ai une page avec un formulaire qui a des champs textes générés dynamiquement. Leur nom l'est aussi.

Quand ma view retourne sur la page, elle transmet un dictionnaire contenant {'nomchamp':'valeur'} dans la methode render_to_response

Sauf que voilà, je n'arrive pas depuis ma page web à voir le contenu de mon dictionnaire :
value="{{ champs[user.keyword] }}"
(ici keyword vaut plouf par exemple)
ne marche pas.


Django veut que je passe par
value="{{ champs.plouf }}"

Sauf que je ne peux pas faire comme ca, vu que mon champ de dictionnaire n'est pas connu à l'avance !

(Django, je m'y met, c'est sympa, mais quand on est dans les pages web, c'est plus vraiment du python, ya plein de trucs qui changent)

Bref, je veux bien un peu d'aide...


Merci
  • # Erf..

    Posté par  (site web personnel) . Évalué à 1.

    J'ai trouvé qu'il était apparement possible de faire
    {% with foo as user.keyword %}
    value="{{champs.plouf}}"

    Manque de pot, le mot clé with n'est pas dispo dans ma version de django...
  • # Je comprend pas très bien

    Posté par  (site web personnel) . Évalué à 2.

    Tu doit parcourir un dictionnaire ?

    Qu'est-ce qui t'empêche de faire :

    {% for key,value in dictionnary.items %}
    {{ key }} {# Ceci est le nom champ #}
    {{ value }} {# Ceci est la valeur #}
    {% endfor %}

    Mais j'ai l'impression de pas avoir capté un truc...
    • [^] # Re: Je comprend pas très bien

      Posté par  (site web personnel) . Évalué à 1.

      Non, je ne veux pas parcourir un dictionnaire, je veux préremplir certains attributs HTML de ma page web avec des valeurs sauvegardées auparavant.

      En gros donc, une boucle génère du code HTML, et dans cette boucle une partie du code est tirée d'un dictionnaire, auquel on accède via une clé dynamique, puisque liée à l'itération courante.

      J'avais essayé un truc basé sur l'itération (ce que tu proposes), mais pour une raison que j'ignore, chez moi key et value sont toujours vides (Django version 0.96.2), bien qu'il boucle pourtant autant de fois qu'il y a d'éléments....
      • [^] # Re: Je comprend pas très bien

        Posté par  (site web personnel) . Évalué à 3.

        En fait j'ai plus ou moins eu le même problème que toi et la solution que j'ai trouvé était d'écrire un filtre perso.

        En gros ça donnerai;


        {% load filters %}
        {% for var in list %}
        {{ dictionnary | get : var}}
        {% endfor %}


        filters.py :

        from django import template

        register = template.Library()

        @register.filter()
        def get(dict, index):
        return dict[index]


        Attention, n'oublie pas de modifier INSTALLED_APPS dans settings.py pour ajouter le filtre. Pour ce faire il faut spécifier un nom de répertoire qui contiendra lui même un répertoire templatetags qui lui sera parcourut pour inclure des filtres.

        Enfin, en tout cas tu doit pouvoir gratter dans cette direction.
        Et aussi, n'hésite pas à poser la question sur #django et sur la mailing list Django tu aura des avis certainement plus éclairés que le mien.
        • [^] # Re: Je comprend pas très bien

          Posté par  (site web personnel) . Évalué à 1.

          Merci beaucoup pour ta réponse qui me convient parfaitement (pas encore implémentée cela dit) et qui en plus me fera office d'introduction à la création de filtre perso !

          Je viens dans tous les cas d'installer django SNV (0.97) car après pour le chapitre des Forms j'ai vu qu'il y avait aussi plein de changement par rapport à la 0.96, donc ça me gave... J'vais pas apprendre des trucs qui seront obsolètes dans 1 mois ou 2 !

          Sinon, j'commence à m'y faire à ce langage de templates django... C'est pas du python, mais c'est vrai qu'à l'usage c'est parfois plus concis...

          Parcontre {% et %} c'est relou, on peut pas changer ça par des touches moins alambiquées (càd sans utiliser <alt gr>) ?
          • [^] # Re: Je comprend pas très bien

            Posté par  (site web personnel) . Évalué à 2.

            A ma connaissance, non ce n'est pas prévu. Cela ne veut pas dire que c'est impossible, il doit y avoir moyen de modifier Django pour cela mais je ne pense pas que ce soit une bonne idée.

            En gros tu peut définir des filtres dans Django (comme celui ci-dessus) et des Tags (plus complexe) mais en tout cas le parser part du principe que :

            {{ var }} -> ça c'est une variable
            {{ var | filter }} -> variable à laquelle on applique un filtre
            {% action %} -> un tag : une action a effectué
            {# comment #} -> commentaire Django, non retourné dans l'HTML

            Le problème c'est que il risque d'y avoir des trucs cassés si on change {%, comme par exemple l'interface d'admin auto générée.

Suivre le flux des commentaires

Note : les commentaires appartiennent à celles et ceux qui les ont postés. Nous n’en sommes pas responsables.