web-dev-qa-db-fra.com

L'objet ne prend pas en charge l'erreur d'affectation d'élément

Dans mon views.py J'attribue des valeurs avant d'enregistrer le formulaire. Je le faisais de la manière suivante:

projectForm.lat = session_results['lat']
projectForm.lng = session_results['lng']

Maintenant, comme la liste des variables est un peu longue, je voulais parcourir session_results avec la boucle suivante (comme décrit par Adam ici ):

for k,v in session_results.iteritems():
    projectForm[k] = v

Mais je reçois l'erreur 'Project' object does not support item assignment pour la solution de boucle. J'ai du mal à comprendre pourquoi. Project est la classe de modèle que j'utilise pour le ModelForm.

Merci de votre aide!

44
neurix

L'erreur semble claire: les objets du modèle ne prennent pas en charge l'affectation des éléments. MyModel.objects.latest('id')['foo'] = 'bar' générera cette même erreur.

C'est un peu déroutant que votre instance de modèle s'appelle projectForm...

Pour reproduire votre premier bloc de code dans une boucle, vous devez utiliser setattr

for k,v in session_results.iteritems():
    setattr(projectForm, k, v)
63

Une autre façon serait d'ajouter la fonction __ getitem __, __ setitem __

def __getitem__(self, key):
    return getattr(self, key)

Vous pouvez utiliser auto [clé] pour accéder maintenant.

19
Ivan Wang