2011-04-01 10 views
39

Implementé una función de recuperación de contraseña en django. Con mi método, la nueva contraseña se enviará a su ID de correo electrónico ingresada. Y funciona bien cuando doy el correo electrónico correcto (id de correo electrónico que existe en la base de datos). Pero cuando le doy un id de correo electrónico que no está en la base de datos, me da este error 'DoesNotExist at/forgotPassword/consulta de coincidencia no existe Error en Django

La consulta correspondiente de UniversityDetails no existe'. ¿Alguien puede ayudar a resolver esto? Pegaré mi código aquí. ¿Alguien puede ayudarme a resolver este problema?

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 > 

Respuesta

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

También veo que estás almacenar sus contraseñas en texto plano (una gran seguridad no-no!) ¿Por qué no usas el sistema de autenticación integrado?

+3

exactamente lo que estaba buscando! Gracias sdolan! – manosim

7

También tuve este problema. Fue causado por el servidor de desarrollo que no eliminó la sesión de django después de un aborto de depuración en Aptana, con la subsiguiente eliminación de la base de datos. (Es decir, el ID de un registro de base de datos no existe todavía estaba presente en la sesión de la próxima vez que el servidor de desarrollo iniciado)

Para resolver este durante el desarrollo, solía

request.session.flush() 
0

En caso de que alguien está aquí y las otras dos soluciones no hacen el truco, compruebe que lo está utilizando para filtrar es lo que esperas:

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

es el correo electrónico una cadena o una Ninguno? o un número entero?

0

Puede intentarlo de esta manera. sólo tiene que utilizar una función para obtener su objeto

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

Como se mencionó en Django docs, cuando get método encuentra ninguna entrada o encuentra varias entradas, se produce una excepción, esto es el comportamiento esperado:

get () plantea MultipleObjectsReturned si se encontró más de un objeto . La excepción MultipleObjectsReturned es un atributo de la clase de modelo .

get() genera una excepción DoesNotExist si no se ha encontrado un objeto para con los parámetros especificados. Esta excepción es un atributo de la clase modelo .

Usar excepciones es una forma de manejar este problema, pero en realidad no me gusta el feo bloque try-except. Una solución alternativa, y más limpia para mí, es usar la combinación de filter + first.

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

Al hacer .first() a un conjunto de consultas vacío se vuelve None. De esta manera puede tener el mismo efecto en una sola línea.

La única diferencia entre capturar la excepción y usar este método ocurre cuando tiene varias entradas, la primera generará una excepción mientras que la segunda establecerá el primer elemento, pero como está usando get, puedo suponer que no lo haremos caer en esta situación.

Tenga en cuenta que se agregó el método first en Django 1.6.

Cuestiones relacionadas