2014-07-06 3 views
0

Comment puis-je gérer cette erreur, son me rend fou:type d'opérande non pris en charge (s) pour +: 'NoneType' et 'NoneType'

unsupported operand type(s) for +: 'NoneType' and 'NoneType' 

également

unsupported operand type(s) for +: 'Float' and 'NoneType' 

je reçois ce que son me dit (je crois) donc c'est le code que j'ai écrit pour essayer de combattre ce

Vue:

session = request.session._session_key 
ind = signedup.objects.filter(sessionid = session) 
team = team_signup.objects.filter(sessionid = session) 
combine = list(chain(ind, team)) 


check = signedup.objects.filter(sessionid = session).count() + team_signup.objects.filter(sessionid = session).count() 
ind = signedup.objects.filter(sessionid = session).aggregate(Sum ('price'))['price__sum'] 
team = team_signup.objects.filter(sessionid = session).aggregate(Sum ('price'))['price__sum'] 
if check == 0: 
    carttotal = 0.00 
elif ind == None: 
    ind = 0.00 
elif team == None: 
    team = 0.00 

carttotal = ind + team 


return render_to_response("cart.html",locals(),context_instance = RequestContext(request)) 

Je me suis dit que ce que je faisais était de mettre leurs valeurs à 0 avant de les additionner si elles n'avaient pas de valeur. Existe-t-il un autre moyen de gérer cela, de sorte que lorsque l'un d'entre eux n'en trouve aucun, il est mis à zéro pour qu'il puisse être ajouté. Aussi, quand les deux ne sont pas à zéro, ils peuvent être mis à 0 afin qu'ils puissent être ajoutés.

+0

d'abord ajouter 'impression int' et' imprimer team' pour voir quelles valeurs sont 'none'. Aussi, est-ce votre vue _Actual_? stacktrace + code exact serait utile – karthikr

+0

oui c'est ma vue actuelle tout ce qui vient après est un retour. Je ne suis pas sûr de ce qu'est la trace de la pile. – user3806832

+0

piletrace est ce que vous voyez sur l'écran d'erreur (qui mentionne le numéro de ligne de la question, etc ..) – karthikr

Répondre

0

Une partie du problème est probablement la logique if/elif. Rappelez-vous que elif ne fonctionnera que si la première instruction if est enregistrée comme fausse. Alors, imaginez ce scénario:

check = 0 
ind = None 
team = None 

Dans ce scénario, le premier que cela se produit est que carttotal se égal à 0. Ensuite, depuis le premier cas était vrai (chèque était 0), les elifs restantes n » t run, et ind + team essayent d'être ajoutés même s'ils n'ont pas été changés de None.

Il existe des manières plus élégantes de le faire, mais si vous changez simplement les élifs en ifs, cela devrait fonctionner correctement. Il y a une certaine redondance là, cependant, et raccourcir la logique par quelques lignes en utilisant un opérateur tertiaire

ind_query = signedup.objects.filter(sessionid = session) 
ind = ind_query.aggregate(Sum ('price'))['price__sum'] if ind_query else 0 

team_query = team_signup.objects.filter(sessionid = session) 
team = team_query.aggregate(Sum ('price'))['price__sum'] if team_query else 0 

carttotal = ind + team 
+0

monsieur, je ne sais pas quoi que ce soit. se sentir plus malin à cause de vous. J'aurais aimé y penser au lieu de ce que j'ai fini par faire (créer une instance fictive si elle n'existe pas (im encore nouveau)). Votre chemin est probablement plus efficace sur la db donc je vais l'utiliser, merci. Je ne savais pas que elif n'arrive que si, si c'est faux. – user3806832

+0

Ouais, elif est la manière abrégée de Python de dire "else, if" - donc la partie "else" doit être vraie (signifiant l'original if était False) avant la seconde si elle sera même évaluée. – MBrizzle

Questions connexes