Подтвердить что ты не робот

Запроса соответствия не существует Ошибка в Django

Я реализовал функцию восстановления пароля в django. В моем методе новый пароль будет отправлен на его введенный идентификатор электронной почты. И он работает нормально, когда я даю правильную электронную почту (идентификатор электронной почты, который существует в базе данных). Но когда я даю идентификатор электронной почты, которого нет в базе данных, он дает мне эту ошибку "DoNotExist at/forgetPassword/

Совпадение запросов 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 >
4b9b3361

Ответ 1

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

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

Ответ 2

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

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

request.session.flush()

Ответ 3

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

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

Ответ 4

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

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

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

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

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

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

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

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

Ответ 5

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

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

Ответ 6

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

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

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