Erreur: «L'élément de séquence de mise à jour du dictionnaire n ° 0 a la longueur 1; 2 est requis »sur Django 1.4

157

J'ai un message d'erreur sur django 1.4:

l'élément de séquence de mise à jour du dictionnaire # 0 a la longueur 1; 2 est requis

[ÉDITER]

Cela s'est produit lorsque j'ai essayé d'utiliser une balise de modèle comme: `{% for v in values%}:

dictionary update sequence element #0 has length 1; 2 is required

Request Method:     GET
Request URL:    ...
Django Version:     1.4.5
Exception Type:     ValueError
Exception Value:    

dictionary update sequence element #0 has length 1; 2 is required

Exception Location:     /usr/local/lib/python2.7/dist-packages/djorm_hstore/fields.py in __init__, line 21
Python Executable:  /usr/bin/uwsgi-core
Python Version:     2.7.3
Python Path:    

['/var/www/',
 '.',
 '',
 '/usr/lib/python2.7',
 '/usr/lib/python2.7/plat-linux2',
 '/usr/lib/python2.7/lib-tk',
 '/usr/lib/python2.7/lib-old',
 '/usr/lib/python2.7/lib-dynload',
 '/usr/local/lib/python2.7/dist-packages',
 '/usr/lib/python2.7/dist-packages',
 '/usr/lib/python2.7/dist-packages/PIL',
 '/usr/lib/pymodules/python2.7']

Server time:    sam, 13 Jul 2013 16:15:45 +0200
Error during template rendering

In template /var/www/templates/app/index.html, error at line 172
dictionary update sequence element #0 has length 1; 2 is required

172     {% for product in products %}

Traceback Switch to copy-and-paste view

/usr/lib/python2.7/dist-packages/django/core/handlers/base.py in get_response

                            response = callback(request, *callback_args, **callback_kwargs)

    ...
 Local vars
/usr/lib/python2.7/dist-packages/django/contrib/auth/decorators.py in _wrapped_view

                    return view_func(request, *args, **kwargs)

    ...
 Local vars
/usr/lib/python2.7/dist-packages/django/views/decorators/http.py in inner

                return func(request, *args, **kwargs)

    ...
 Local vars
./app/views.py in index

            context_instance=RequestContext(request))

    ...
 Local vars
/usr/lib/python2.7/dist-packages/django/shortcuts/__init__.py in render_to_response

        return HttpResponse(loader.render_to_string(*args, **kwargs), **httpresponse_kwargs)

    ...
 Local vars
/usr/lib/python2.7/dist-packages/django/template/loader.py in render_to_string

            return t.render(context_instance)

    ...
 Local vars
/usr/lib/python2.7/dist-packages/django/template/base.py in render

                return self._render(context)

    ...
 Local vars
/usr/lib/python2.7/dist-packages/django/template/base.py in _render

            return self.nodelist.render(context)

    ...
 Local vars
/usr/lib/python2.7/dist-packages/django/template/base.py in render

                    bit = self.render_node(node, context)

    ...
 Local vars
/usr/lib/python2.7/dist-packages/django/template/debug.py in render_node

                return node.render(context)

    ...
 Local vars
/usr/lib/python2.7/dist-packages/django/template/loader_tags.py in render

            return compiled_parent._render(context)

    ...
 Local vars
/usr/lib/python2.7/dist-packages/django/template/base.py in _render

            return self.nodelist.render(context)

    ...
 Local vars
/usr/lib/python2.7/dist-packages/django/template/base.py in render

                    bit = self.render_node(node, context)

    ...
 Local vars
/usr/lib/python2.7/dist-packages/django/template/debug.py in render_node

                return node.render(context)

    ...
 Local vars
/usr/lib/python2.7/dist-packages/django/template/loader_tags.py in render

                result = block.nodelist.render(context)

    ...
 Local vars
/usr/lib/python2.7/dist-packages/django/template/base.py in render

                    bit = self.render_node(node, context)

    ...
 Local vars
/usr/lib/python2.7/dist-packages/django/template/debug.py in render_node

                return node.render(context)

    ...
 Local vars
/usr/lib/python2.7/dist-packages/django/template/defaulttags.py in render

            len_values = len(values)

    ...
 Local vars
/usr/lib/python2.7/dist-packages/django/core/paginator.py in __len__

            return len(self.object_list)

    ...
 Local vars
/usr/lib/python2.7/dist-packages/django/db/models/query.py in __len__

                    self._result_cache = list(self.iterator())

    ...
 Local vars
/usr/lib/python2.7/dist-packages/django/db/models/query.py in iterator

                        obj = model(*row[index_start:aggregate_start])

    ...
 Local vars
/usr/lib/python2.7/dist-packages/django/db/models/base.py in __init__

                    setattr(self, field.attname, val)

    ...
 Local vars
/usr/local/lib/python2.7/dist-packages/djorm_hstore/fields.py in __set__

                value = self.field._attribute_class(value, self.field, obj)

    ...
 Local vars
/usr/local/lib/python2.7/dist-packages/djorm_hstore/fields.py in __init__

            super(HStoreDictionary, self).__init__(value, **params)

    ...
 Local vars

Cela se produit aussi lorsque j'essaye d'accéder à un jeu de requêtes hstore:

[Éditer]

Traceback (most recent call last):
File "manage.py", line 14, in <module>
    execute_manager(settings)

File "/usr/local/lib/python2.7/dist-packages/django/core/management/__init__.py", line 459, in execute_manager
    utility.execute()

File "/usr/local/lib/python2.7/dist-packages/django/core/management/__init__.py", line 382, in execute
    self.fetch_command(subcommand).run_from_argv(self.argv)

File "/usr/local/lib/python2.7/dist-packages/django/core/management/base.py", line 196, in run_from_argv
    self.execute(*args, **options.__dict__)

File "/usr/local/lib/python2.7/dist-packages/django/core/management/base.py", line 232, in execute
    output = self.handle(*args, **options)

File "/home/name/workspace/project/app/data/commands/my_command.py", line 60, in handle
    item_id = tmp[0].id,

File "/usr/local/lib/python2.7/dist-packages/django/db/models/query.py", line 207, in __getitem__
    return list(qs)[0]

File "/usr/local/lib/python2.7/dist-packages/django/db/models/query.py", line 87, in __len__
    self._result_cache.extend(self._iter)

File "/usr/local/lib/python2.7/dist-packages/django/db/models/query.py", line 301, in iterator
    obj = model(*row[index_start:aggregate_start])

File "/usr/local/lib/python2.7/dist-packages/django/db/models/base.py", line 300, in __init__
    setattr(self, field.attname, val)

File "/usr/local/lib/python2.7/dist-packages/djorm_hstore/fields.py", line 38, in __set__
    value = self.field._attribute_class(value, self.field, obj)

File "/usr/local/lib/python2.7/dist-packages/djorm_hstore/fields.py", line 21, in __init__
    super(HStoreDictionary, self).__init__(value, **params)

ValueError: dictionary update sequence element #0 has length 1; 2 is required

le code est:

tmp = Item.objects.where(HE("kv").contains({'key':value}))

if tmp.count() > 0:

    item_id = tmp[0].id,

J'essaye juste d'accéder à la valeur. Je ne comprends pas le message "séquence de mise à jour". Lorsque j'utilise un curseur au lieu de hstore queryset, la fonction fonctionne. L'erreur vient également du rendu du modèle. Je viens de redémarrer uwsgiet tout fonctionne bien, mais l'erreur revient plus tard.

[Éditer]

Quelqu'un a-t-il une idée?

user2575627
la source
Veuillez publier le code qui montre ce qu'il y a dans valueset tmp. Bien que le code soit manquant, -1 (éventuellement temporaire) pour cette question.
ElmoVanKielmo
Je vais l'ajouter en commentaire. J'ai eu l'erreur parce que j'ai utilisé une liste au lieu d'un tuple. Cela soulève l'erreur: dict(['A',"b"])alors que ce n'est pas le casdict([('A',"b")])
NelsonGon

Réponses:

397

Je viens de rencontrer ce problème. Je ne sais pas si c'est la même chose qui a frappé votre code, mais pour moi, la cause principale était parce que j'ai oublié de mettre name=le dernier argument de l' appel de fonction url(ou pathdans Django 2.0+).

Par exemple, les fonctions suivantes génèrent l'erreur de la question:

url(r'^foo/(?P<bar>[A-Za-z]+)/$', views.FooBar.as_view(), 'foo')
path('foo/{slug:bar}/', views.FooBar, 'foo')

Mais ceux-ci fonctionnent réellement:

url(r'^foo/(?P<bar>[A-Za-z]+)/$', views.FooBar.as_view(), name='foo')
path('foo/{slug:bar}/', views.FooBar, name='foo')

La raison pour laquelle le retraçage est inutile parce que l' interne, Django veut analyser la donnée de position argument comme mot - clé l' argument kwargs, et comme une chaîne est un itératives, un chemin de code atypique commence à se dérouler. Utilisez toujours name=sur vos URL!

Thane Brimhall
la source
40
Cette réponse est très bonne car elle couvre une erreur obscure difficile à comprendre. Même les développeurs Django chevronnés peuvent tomber dans ce piège particulier.
glarrain
4
Surtout si vous utilisez également la Router.registerméthode de Django RestFramework. Il semble très similaire, la différence est le namekwarg ...
Risadinha
4
Eh bien, c'est une demi-heure passée de manière improductive qui ne reviendrait jamais. tnx.
Iman Akbari du
2
Brillant! Exactement ce que j'ai oublié: S
rschwieb
2
Pour info, j'ai également reçu cette erreur en utilisant l' pathURL de style Django 2.0 . Vous avez oublié d'utiliser le kwarg et avait ceci: path('foo/', views.foo, 'foo'). Je devais changer pourpath('foo/', views.foo, name='foo')
inostia
38

J'ai eu cette erreur lorsque je jouais avec une chaîne et un dictionnaire.

dict1 = {'taras': 'vaskiv', 'iruna': 'vaskiv'}
str1 = str(dict1)
dict(str1)
*** ValueError: dictionary update sequence element #0 has length 1; 2 is required

Donc, ce que vous devez faire pour obtenir un dict à partir d'une chaîne est:

dic2 = eval(str1)
dic2
{'taras': 'vaskiv', 'iruna': 'vaskiv'}

Ou en matière de sécurité, nous pouvons utiliser literal_eval

from ast import literal_eval
Taras Vaskiv
la source
Y a-t-un autre moyen de faire ça?
adam shamsudeen
28

Une erreur dans votre question est générée lorsque vous essayez quelque chose comme ceci:

>>> a_dictionary = {}
>>> a_dictionary.update([[1]])
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
ValueError: dictionary update sequence element #0 has length 1; 2 is required

Il est difficile de dire où est la cause dans votre code à moins d'afficher votre code, suivi complet.

falsetru
la source
5
Cela confirme que la cause n'est pas incluse dans la question.
ElmoVanKielmo
Merci pour la réponse la prochaine fois que je copierai le traçage, mais c'est bizarre, quand c'est arrivé avec la balise template, juste après le redémarrage de uwsgi, le résultat s'affiche correctement, donc il y avait un résultat
user2575627
2
@ user2575627, pourquoi ne publiez-vous pas de code / traceback maintenant? Mettez à jour (modifiez) votre question.
falsetru
Désolé, je n'ai pas publié de code / traceback car il était urgent de réparer / réparer le service, donc je n'ai pas copié le traceback la première fois
user2575627
@ user2575627, pourriez-vous publier des codes autour de /home/name/workspace/project/app/data/commands/my_command.py ligne 60?
falsetru
18

J'ai rencontré le problème mentionné ci-dessus lorsque j'ai oublié de passer un nom d' argument de mot-clé à la fonction url ().

Code avec erreur

 url(r"^testing/$", views.testing, "testing")

Code sans erreur

url(r"^testing/$", views.testing, name="testing")

Donc, finalement, j'ai supprimé l'erreur ci-dessus de cette manière. Cela pourrait être quelque chose de différent dans votre cas. Vérifiez donc vos modèles d'URL dans urls.py .

hygull
la source
1
2019 et la même réponse de stackoverflow me sauve toujours à chaque fois
Long Nguyen
Ouais, merci beaucoup. SO est vraiment une excellente plate-forme pour les développeurs, les scientifiques et autres.
hygull
10

Solution"

Passez un nom d' argument mot-clé avec une valeur comme nom de votre vue, par exemple homeou home-viewetc. à la url()fonction.

Génère une erreur »

url(r'^home$', 'common.views.view1', 'home'),

Correct"

url(r'^home$', 'common.views.view1', name='home'),

Benjamin McIntire
la source
9

Voici l'erreur reproduite.

>>> d = {}
>>> d.update([(1,)])
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
ValueError: dictionary update sequence element #0 has length 1; 2 is required
>>> 
>>> d
{}
>>> 
>>> d.update([(1, 2)])
>>> d
{1: 2}
>>> 
>>> d.update('hello_some_string')
Traceback (most recent call last):
File "<stdin>", line 1, in <module>  
ValueError: dictionary update sequence element #0 has length 1; 2 is required
>>> 

Si vous donnez la séquence et que toute longueur d'élément est de 1 et qu'il en faut deux, nous obtiendrons ce genre d'erreur. Voir le code ci-dessus. La première fois que j'ai donné la séquence avec tuple et sa longueur 1, nous avons eu l'erreur et le dictionnaire n'est pas mis à jour. la deuxième fois que j'ai donné un tuple intérieur avec deux éléments, le dictionnaire a été mis à jour.

néotam
la source
J'obtiens la même erreur en utilisant shortucts.redirect et en essayant d'envoyer la réponse à une page externe .. par exemple '[code] return redirect (" msn.com") [/ code]
roblem
3

J'ai eu le même problème et j'ai trouvé que c'était dû à de mauvais paramètres. En views.py, j'ai utilisé:

return render(request, 'demo.html',{'items', items})    

Mais je trouve la question: {'items', items}. Changer pour {'items': items}résoudre le problème.

Binoy Babu
la source
2

Dans mon cas, mon get_context_datadans l'une de mes vues retournait return render(self.request, 'es_connection_error.html', {'error':error});dans un bloc try / catch au lieu de revenircontext

shadi
la source
2

L'erreur doit être avec les paramètres. Veuillez vérifier que les paramètres sont un objet dictionnaire . S'il ne s'agit que d'une liste / d'un tuple d'arguments, utilisez un seul * ( *params) au lieu de deux * ( **params). Cela explose la liste / le tuple en la quantité appropriée d'arguments.

Ou, si les paramètres proviennent d'une autre partie du code en tant que fichier JSON, veuillez le faire json.loads(params), car les objets JSON se comportent parfois comme une chaîne et vous devez donc en faire un JSON en utilisant load from string (charges).

super(HStoreDictionary, self).__init__(value, **params)

J'espère que cela t'aides!

Midhun C Nair
la source
1

J'ai rencontré ce problème en essayant d'appeler la méthode de mise à jour avec un paramètre d'un type incorrect. Le dict attendu était:

{'foo': True}

Celui qui a été adopté était:

{'foo': "True"}

assurez-vous de vérifier que tous les paramètres que vous passez sont du type attendu.

Nick Kobishev
la source
0

Vous envoyez un paramètre de manière incorrecte; ce devrait être un dictionary object:

  • Faux: func(a=r)

  • Correct: func(a={'x':y})

soField
la source
0

J'ai aussi eu un type de problème similaire. La solution est simple. N'essayez simplement pas d'entrer la valeur NULL ou None dans les valeurs ou vous devrez peut-être utiliser quelque chose comme ça
dic.update([(key,value)])

yunus
la source