python - urls - render django
búsqueda coincidente no existe Error en Django (5)
Implementé una funcionalidad 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 /
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 >
Como se menciona en los documentos de Django , cuando el método get
no encuentra ninguna entrada o encuentra varias entradas, genera una excepción, este es el comportamiento esperado:
get () aumenta 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 encontró un objeto para 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 first
la combinación de filter
+.
user = UniversityDetails.objects.filter(email=email).first()
Cuando haces .first()
a un queryset vacío, devuelve 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 tienes múltiples entradas, la primera generará una excepción, mientras que la segunda establecerá el primer elemento, pero a medida que uses get
puedo asumir que no caeremos en esta situación. .
Tenga en cuenta que el first
método fue agregado en Django 1.6.
En caso de que alguien esté aquí y las otras dos soluciones no sean el truco, compruebe que lo que está utilizando para filtrar es lo que espera:
user = UniversityDetails.objects.get(email=email)
¿Es una cadena de correo electrónico o una None? o un número entero?
Puedes intentarlo de esta manera. solo usa una función para obtener tu objeto
def get_object(self, id):
try:
return UniversityDetails.objects.get(email__exact=email)
except UniversityDetails.DoesNotExist:
return False
Yo 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. (Lo que significa que la identificación de un registro de base de datos inexistente todavía estaba presente en la sesión la próxima vez que se inició el servidor de desarrollo)
Para resolver esto durante el desarrollo, utilicé
request.session.flush()
try:
user = UniversityDetails.objects.get(email=email)
except UniversityDetails.DoesNotExist:
user = None
También veo que estás almacenando tus contraseñas en texto plano (¡una gran seguridad, no, no!). ¿Por qué no usas el sistema de autenticación integrado?