web-dev-qa-db-de.com

übereinstimmende Abfrage existiert nicht Fehler in Django

Ich habe eine Passwortwiederherstellungsfunktion in Django implementiert. Bei meiner Methode wird das neue Passwort an seine eingegebene E-Mail-ID gesendet. Und es funktioniert gut, wenn ich die richtige E-Mail (E-Mail-ID, die in der Datenbank vorhanden ist) gebe. Aber wenn ich eine E-Mail-ID gebe, die sich nicht in der Datenbank befindet, wird der Fehler "DoesNotExist at/forgotPassword /" angezeigt.

Übereinstimmende Abfrage für UniversityDetails existiert nicht. ' Kann jemand helfen, dies zu lösen. Füge meinen Code hier ein. Kann mir jemand helfen, dieses Problem zu lösen.

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

Ich sehe auch, dass Sie Ihre Passwörter im Klartext speichern (ein großes Sicherheits-Nein-Nein!). Warum verwenden Sie nicht das eingebaute Authentifizierungssystem?

142
Sam Dolan

Ich hatte auch dieses Problem. Dies wurde dadurch verursacht, dass der Entwicklungsserver die Sitzung Django nach einem Debug-Abbruch in Aptana nicht löschte und anschließend die Datenbank löschte. (Dies bedeutet, dass die ID eines nicht vorhandenen Datenbankdatensatzes in der Sitzung noch vorhanden war das nächste Mal, wenn der Entwicklungsserver gestartet wird)

Um dies während der Entwicklung zu beheben, habe ich verwendet

request.session.flush()
7
Robse

Sie können dies in Ihrem Fall verwenden, es wird gut funktionieren.

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

Wie in Django docs erwähnt, löst die Methode get, wenn sie keinen oder mehrere Einträge findet, eine Ausnahme aus. Dies ist das erwartete Verhalten:

get () löst MultipleObjectsReturned aus, wenn mehr als ein Objekt gefunden wurde. Die MultipleObjectsReturned-Ausnahme ist ein Attribut der Modellklasse.

get () löst eine DoesNotExist-Ausnahme aus, wenn für die angegebenen Parameter kein Objekt gefunden wurde. Diese Ausnahme ist ein Attribut der Modellklasse.

Die Verwendung von Ausnahmen ist eine Möglichkeit, um dieses Problem zu lösen, aber mir gefällt der hässliche try-except - Block nicht. Eine alternative und für mich sauberere Lösung besteht darin, die Kombination von filter + first zu verwenden.

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

Wenn Sie .first() für ein leeres Abfrageset ausführen, wird None zurückgegeben. Auf diese Weise können Sie den gleichen Effekt in einer einzelnen Zeile erzielen.

Der einzige Unterschied zwischen dem Abfangen der Ausnahme und der Verwendung dieser Methode besteht darin, dass Sie mehrere Einträge haben. Der erste löst eine Ausnahme aus, während der zweite das erste Element setzt. Da Sie jedoch get verwenden, kann ich davon ausgehen, dass wir gewonnen haben. ' t auf diese Situation fallen.

Beachten Sie, dass die first -Methode für Django 1.6 hinzugefügt wurde.

Sie können diesen Weg versuchen. Verwenden Sie einfach eine Funktion, um Ihr Objekt zu erhalten

def get_object(self, id):
    try:
        return UniversityDetails.objects.get(email__exact=email)
    except UniversityDetails.DoesNotExist:
        return False
1
Mehedi Hasan

Wenn jemand hier ist und die anderen beiden Lösungen nicht den Trick machen, prüfen Sie, ob Sie mit den Filtern genau das erreichen, was Sie erwarten:

user = UniversityDetails.objects.get(email=email)

ist E-Mail eine str oder eine None? oder ein int?

0