J'ai implémenté une fonctionnalité de récupération de mot de passe dans Django. Avec ma méthode, le nouveau mot de passe sera envoyé à son adresse e-mail saisie. Et ça marche bien quand je donne le bon email (id e-mail qui existe dans la base de données). Mais quand je donne un identifiant d'e-mail qui n'est pas dans la base de données, il me donne cette erreur 'DoesNotExist at/ForgotPassword /
La requête correspondante UniversityDetails n'existe pas. '. Quelqu'un peut-il aider à résoudre ce problème? Collera mon code ici. Quelqu'un peut-il m'aider à résoudre ce problème.
ForgotPassword.html ()
def forgotPassword(request):
if request.POST:
email=request.POST.get("email")
user = UniversityDetails.objects.get(email=email)
if(not user):
print "No user"
return render_to_response("forgotPassword.html")
else:
newPassword = user.password
send_mail('Password Recovery', 'The password for your site is '+ newPassword, '[email protected]',
['[email protected]'], fail_silently=False)
return render_to_response("passwordRecovery.html")
return render_to_response('forgotPassword.html')
html
<form name="forgotPassword" method="POST" id="myFormid" action="http://10.1.0.90:8080/forgotPassword/">
<div style="float:center;width:100%;color:#0000A0">
Enter your E-mail ID</label><br/> <input type="text" name="email" size="25" />
<input type="submit" value="Submit" />
</div>
</form >
try:
user = UniversityDetails.objects.get(email=email)
except UniversityDetails.DoesNotExist:
user = None
Je vois également que vous stockez vos mots de passe en clair (une grande sécurité non-non!). Pourquoi n'utilisez-vous pas le système d'authentification intégré?
J'ai aussi eu ce problème. Cela est dû au fait que le serveur de développement n'a pas supprimé la session Django après un abandon de débogage dans Aptana, avec suppression ultérieure de la base de données. (Cela signifie que l'ID d'un enregistrement de base de données inexistant était toujours présent dans la session). la prochaine fois que le serveur de développement a démarré)
Pour résoudre ce problème pendant le développement, j'ai utilisé
request.session.flush()
Vous pouvez l'utiliser dans votre cas, cela fonctionnera bien.
user = UniversityDetails.objects.filter(email=email).first()
Comme mentionné dans Django docs , lorsque la méthode get
ne trouve aucune entrée ou trouve plusieurs entrées, elle déclenche une exception, voici le comportement attendu:
get () déclenche MultipleObjectsReturned si plusieurs objets ont été trouvés. L'exception MultipleObjectsReturned est un attribut de la classe de modèle.
get () déclenche une exception DoesNotExist si aucun objet n’a été trouvé pour les paramètres donnés. Cette exception est un attribut de la classe de modèle.
L'utilisation d'exceptions est un moyen de gérer ce problème, mais je n'aime pas vraiment le laid bloc try-except
. Une solution alternative, et plus propre pour moi, consiste à utiliser la combinaison de filter
+ first
.
user = UniversityDetails.objects.filter(email=email).first()
Lorsque vous effectuez .first()
sur un ensemble de requêtes vide, il renvoie None
. De cette façon, vous pouvez avoir le même effet sur une seule ligne.
La seule différence entre intercepter l'exception et utiliser cette méthode se produit lorsque vous avez plusieurs entrées, la première lèvera une exception tandis que la seconde définira le premier élément, mais pendant que vous utilisez get
je peux supposer que nous avons gagné ' t tomber sur cette situation.
Notez que la méthode first
a été ajoutée le Django 1.6.
Vous pouvez essayer de cette façon. utilisez simplement une fonction pour obtenir votre objet
def get_object(self, id):
try:
return UniversityDetails.objects.get(email__exact=email)
except UniversityDetails.DoesNotExist:
return False
Dans le cas où quelqu'un est là et que les deux autres solutions ne font pas l'affaire, vérifiez que ce que vous utilisez pour filtrer est ce que vous attendez:
user = UniversityDetails.objects.get(email=email)
le courrier électronique est-il un str
ou un None
? ou un int
?