Bienvenue sur IndexError.

Ici vous pouvez poser des questions sur Python et le Framework Django.

Mais aussi sur les technos front comme React, Angular, Typescript et Javascript en général.

Consultez la FAQ pour améliorer vos chances d'avoir des réponses à vos questions.

Could not parse the remainder: '-title' from 'data.short-title'

0 votes

Bonjour,

Je souhaite afficher les information dans un template django issue d'une variable mais cela me retourne une erreur :

Could not parse the remainder: '-title' from 'data.short-title'

Dans le template :

  Short Title : {{ data.short-title }}<br>

Il semble que le tiret dans le nom de variable pose problème. J'ai essayé ça dans ipython :

In [1]: test = {'toto-tet' : 'sdf'}

In [2]: test
Out[2]: {'toto-tet': 'sdf'}

In [3]: test['toto-tet']
Out[3]: 'sdf'

Auriez vous une idée pour résoudre ce problème ? La valeur de cette variable est issue d'un fichier YAML généré par une autre application et il ne m'est pas possible de la renommer. Je cherche un moyen de l'afficher dans le gabarit django directement sans avoir à la renommer dans views.py avant.

Merci

demandé 29-Mar par Stiquemou (190 points)
rouvert 7-Avr par max

Oui en python il n'y'as pas de - dans le nommage, mais sa pourrait pas passer avec un templatetag qui utiliserait getattr pour retourner l'attribut de data?

getattr(data, 'short-title') # marche chez moi

Merci pour ta réponse. J'ai essayé, en placant cela dans la vue :

je vois bien la clé dans le dict (logs)

{'title': 'Observer & Guardian contre Royaume-Uni', 'issued': {'month': 11, 'day': 26, 'year': 1991}, 'section': None, 'number': u'n^o^\xa013585/88', 'authority': u'Cour\xa0EDH', 'title-short': 'Observer c. R.-U.', 'position': 0, 'type': 'legal_case', 'id': 'cedhObserver'}

quand j'essaye de récupérer la valeur avec ta proposition :

Internal Server Error: /
Traceback (most recent call last):
  File "/home/alex/.virtualenv/exegetetool/local/lib/python2.7/site-packages/django/core/handlers/exception.py", line 42, in inner
    response = get_response(request)
  File "/home/alex/.virtualenv/exegetetool/local/lib/python2.7/site-packages/django/core/handlers/base.py", line 187, in _get_response
    response = self.process_exception_by_middleware(e, request)
  File "/home/alex/.virtualenv/exegetetool/local/lib/python2.7/site-packages/django/core/handlers/base.py", line 185, in _get_response
    response = wrapped_callback(request, *callback_args, **callback_kwargs)
  File "/home/alex/dev/exegetetool/data/views.py", line 80, in index
    datas = load_yaml(True)
  File "/home/alex/dev/exegetetool/data/views.py", line 23, in load_yaml
    getattr(data, 'title-short')
AttributeError: 'dict' object has no attribute 'title-short'

Le bout de code :

def load_yaml(position=False):
"""

"""
with open(data_file, 'r') as file:
    try:
        datas = yaml.load(file)
        if position:
            position = 0
            for data in datas['references']:
                data['position'] = position
                position += 1
                print(data)
                getattr(data, 'title-short')
    except yaml.YAMLError as e:
        print(e)
return datas['references']

Oui pardon avec un dict c'est juste data.get('key')

Effectivement, ça fonctionne :)

Merci bien !

Faut pas fermer une question mais valider la réponse en cochant la coche sous le nb de votes.
Et là le problème c'est qu'il n'y a pas de réponse, juste un commentaire. Il faudrait mettre une réponse et la valider. Merci.

Votre réponse

Preview

Votre nom à afficher ( en option ):
Vie privée: . Votre adresse de messagerie ne sera utilisée que pour l'envoi de ces notifications .
Vérification anti -spam:
Pour éviter cette vérification à l'avenir, Connectez vous ou inscrivez vous.
...