web-dev-qa-db-fra.com

la requête correspondante n'existe pas Erreur dans Django

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 >
52
rv_k
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é?

142
Sam Dolan

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()
7
Robse

Vous pouvez l'utiliser dans votre cas, cela fonctionnera bien.

user = UniversityDetails.objects.filter(email=email).first()
1
vikasvmads

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.

1

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
1
Mehedi Hasan

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?

0
Alejandro Varela