web-dev-qa-db-ja.com

一致するクエリは存在しませんDjangoのエラー

Djangoにパスワード回復機能を実装しました。私の方法では、入力された彼のメールIDに新しいパスワードが送信されます。そして、私は正しい電子メール(データベースに存在する電子メールID)を与えるとうまく動作します。しかし、データベースにないメールIDを指定すると、このエラーが表示されます 'DoesNotExist at/forgotPassword /

UniversityDetails一致するクエリは存在しません。 '。誰かがこれを解決するのを助けることができます。ここにコードを貼り付けます。誰かがこの問題を解決するのを手伝ってもらえますか。

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

また、パスワードをプレーンテキストで保存していることもわかります(大きなセキュリティはありません!)。組み込みの認証システムを使用しないのはなぜですか?

142
Sam Dolan

私もこの問題を抱えていました。これは、Aptanaでデバッグが中止された後、開発サーバーがDjangoセッションを削除せず、その後データベースが削除されたために発生しました。次回開発サーバーが起動したとき)

開発中にこれを解決するために、私は

request.session.flush()
7
Robse

あなたのケースでこれを使用することができます、それはうまく働きます。

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

Django docs で述べたように、getメソッドがエントリを検出しないか、複数のエントリを検出すると、例外が発生します。これは予期される動作です。

get()は、複数のオブジェクトが見つかった場合にMultipleObjectsReturnedを発生させます。 MultipleObjectsReturned例外は、モデルクラスの属性です。

get()は、指定されたパラメーターのオブジェクトが見つからなかった場合にDoesNotExist例外を発生させます。この例外は、モデルクラスの属性です。

例外を使用することはこの問題を処理する方法ですが、実際にはbutい_try-except_ブロックが好きではありません。別の解決策であり、私にとってわかりやすいのは、filter + firstの組み合わせを使用することです。

_user = UniversityDetails.objects.filter(email=email).first()
_

空のクエリセットに対して.first()を実行すると、Noneが返されます。これにより、1行で同じ効果を得ることができます。

例外をキャッチすることとこのメソッドを使用することの唯一の違いは、複数のエントリがある場合に発生します。前者は例外を発生させ、後者は最初の要素を設定しますが、getを使用しているため、この状況に該当します。

firstメソッドがDjango 1.6で追加されました。

この方法を試すことができます。関数を使用してオブジェクトを取得するだけです

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

誰かがここにいて、他の2つの解決策でうまくいかない場合は、フィルタリングに使用しているものが期待どおりであることを確認してください。

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

電子メールはstrまたはNoneですか?またはint

0