соответствующего запроса не существует Ошибка в Django - PullRequest
50 голосов
/ 01 апреля 2011

Я реализовал функцию восстановления пароля в django. С моим методом новый пароль будет отправлен на его адрес электронной почты. И это работает нормально, когда я даю правильный адрес электронной почты (идентификатор электронной почты, который существует в базе данных). Но когда я даю идентификатор электронной почты, которого нет в базе данных, он выдает мне эту ошибку: «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, 'rv_nair@gmail.com',
    ['rv_ks@gmail.com'], 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 >

Ответы [ 6 ]

141 голосов
/ 01 апреля 2011
try:
    user = UniversityDetails.objects.get(email=email)
except UniversityDetails.DoesNotExist:
    user = None

Я также вижу, что вы храните свои пароли в незашифрованном виде (большой безопасности нет-нет!). Почему вы не используете встроенную систему аутентификации?

7 голосов
/ 16 марта 2012

У меня тоже была эта проблема. Это было вызвано тем, что сервер разработки не удалял сеанс django после прерывания отладки в Aptana с последующим удалением базы данных. (То есть идентификатор несуществующей записи базы данных все еще присутствовал в сеансе при следующем запуске сервера разработки)

Чтобы решить эту проблему во время разработки, я использовал

request.session.flush()
1 голос
/ 06 октября 2018

Вы можете использовать это в вашем случае, он будет работать нормально.

user = UniversityDetails.objects.filter(email=email).first()
1 голос
/ 27 июля 2017

Как упомянуто в Django docs , когда метод get не находит запись или находит несколько записей, он вызывает исключение, это ожидаемое поведение:

get () повышает MultipleObjectsReturned, если было найдено более одного объекта.Исключение MultipleObjectsReturned является атрибутом класса модели.

get () вызывает исключение DoesNotExist, если объект не найден для заданных параметров.Это исключение является атрибутом класса модели.

Использование исключений - способ решения этой проблемы, но на самом деле мне не нравится уродливый блок try-except.Альтернативное и более чистое решение для меня - использовать комбинацию filter + first.

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

Когда вы делаете .first() для пустого набора запросов, он возвращает None.Таким образом, вы можете иметь тот же эффект в одной строке.

Единственная разница между перехватом исключения и использованием этого метода возникает, когда у вас есть несколько записей, первая вызовет исключение, а вторая установит первый элемент, но, поскольку вы используете get, я могу предположитьмы не будем попадать в эту ситуацию.

Обратите внимание, что метод first был добавлен в Django 1.6.

1 голос
/ 19 февраля 2017

Вы можете попробовать этот способ. просто используйте функцию, чтобы получить ваш объект

def get_object(self, id):
    try:
        return UniversityDetails.objects.get(email__exact=email)
    except UniversityDetails.DoesNotExist:
        return False
0 голосов
/ 14 декабря 2016

Если здесь кто-то есть, а другие два решения не сработают, проверьте, что вы используете для фильтрации то, что вы ожидаете:

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

- это электронная почта str илиNone?или int?

...