2011-04-01 21 views
39

में त्रुटि मैंने django में पासवर्ड रिकवरी कार्यक्षमता लागू की है। मेरी विधि के साथ नया पासवर्ड दर्ज की गई उसकी ईमेल आईडी पर भेजा जाएगा। और जब मैं सही ईमेल (डेटाबेस में मौजूद ई-मेल आईडी) देता हूं तो यह ठीक काम करता है। लेकिन जब मैं एक ईमेल आईडी देता हूं जो डेटाबेस में नहीं है, तो यह मुझे यह त्रुटि देता है 'DoNotExist at/forgotPassword/मिलान क्वेरी मौजूद नहीं है Django

विश्वविद्यालय विवरण मिलान क्वेरी मौजूद नहीं है।' क्या कोई इसे हल करने में मदद कर सकता है। यहां मेरा कोड पेस्ट करेगा। क्या कोई इस समस्या को हल करने में मेरी मदद कर सकता है।

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') 

एचटीएमएल

<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 > 

उत्तर

122
try: 
    user = UniversityDetails.objects.get(email=email) 
except UniversityDetails.DoesNotExist: 
    user = None 

मैं यह भी देख आप प्लेन में अपने पासवर्ड भंडारण कर रहे हैं (एक बड़ा सुरक्षा नहीं-नहीं!)। आप बिल्ट-इन ऑथ सिस्टम का उपयोग क्यों नहीं करते?

+3

बिल्कुल वही जो मैं खोज रहा था! धन्यवाद sdolan! – manosim

7

मुझे यह समस्या भी थी। यह बाद में डेटाबेस हटाना के साथ, Aptana में डीबग निरस्त करने के बाद विकास सर्वर को डीजेंगो सत्र को हटा नहीं रहा था। विकास के दौरान इसके समाधान के लिए

(गैर-मौजूद डेटाबेस रिकॉर्ड की आईडी मतलब अभी भी सत्र अगली बार विकास सर्वर शुरू कर दिया में मौजूद था), मैं

request.session.flush() 
0

इस्तेमाल किया मामले में किसी को भी यहाँ है और अन्य दो समाधान चाल नहीं करते हैं, देखें कि आप फिल्टर करने के लिए प्रयोग कर रहे हैं कि आप क्या उम्मीद है कि:

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

एक स्ट्रिंग, या एक से कोई भी ईमेल है? या एक पूर्णांक?

0

आप इस तरह से प्रयास कर सकते हैं। सिर्फ एक समारोह का उपयोग अपने वस्तु पाने के लिए

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

Django docs में उल्लेख किया है, जब get विधि कोई प्रवेश पाता है या कई प्रविष्टियाँ पाता है, यह एक अपवाद को जन्म देती है, इस अपेक्षित व्यवहार है:

प्राप्त () एकाधिक ऑब्जेक्ट्स को फिर से बढ़ाया जाता है यदि एक से अधिक ऑब्जेक्ट पाया गया था। MultObjectsReturned अपवाद मॉडल क्लास की विशेषता है।

प्राप्त करें() दिए गए पैरामीटर के लिए कोई ऑब्जेक्ट नहीं मिला है, तो एक DSNotExist अपवाद उठाता है। यह अपवाद मॉडल वर्ग की विशेषता है।

अपवादों का उपयोग इस समस्या को संभालने का एक तरीका है, लेकिन मुझे वास्तव में बदसूरत try-except ब्लॉक पसंद नहीं है। एक वैकल्पिक समाधान, और मेरे लिए क्लीनर, filter + first के संयोजन का उपयोग करना है।

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

यह None रिटर्न जब आप एक खाली क्वेरीसमूह को .first() है। इस तरह आप एक ही पंक्ति में एक ही प्रभाव डाल सकते हैं।

अपवाद को पकड़ने और इस विधि का उपयोग करने के बीच केवल अंतर होता है जब आपके पास एकाधिक प्रविष्टियां होती हैं, तो पूर्व अपवाद उठाएगा, जबकि बाद वाला पहला तत्व सेट करेगा, लेकिन जैसा कि आप get का उपयोग कर रहे हैं, मुझे लगता है कि हम नहीं करेंगे इस स्थिति पर गिरना।

ध्यान दें कि first विधि Django 1.6 पर जोड़ा गया था।

संबंधित मुद्दे