Я думаю, что это, вероятно, больше, чем вы хотите:
try:
user = User.objects.get(email__exact=email)
if authenticate(user, email, password):
request.session['user'] = user
return HttpResponseRedirect('/home/')
else:
return HttpResponseRedirect('/home/login/')
except User.DoesNotExist: # A user with the e-mail provided was not found
return HttpResponseRedirect('/home/')
Лично я считаю, что это чище, чем метод Игнасио, но на самом деле это вопрос вкуса.
Наконец, последняя часть вашего вопроса («Как считать строки?»):
get
только когда-либо возвращает объект и вызывает исключение, если ни один объект не соответствует критериям, которые вы ввели, или если несколько объектов соответствуют критериям. Чтобы получить количество объектов в QuerySet
, вы можете просто позвонить len
на него:
q = User.objects.filter(email = 'foo@bar.com')
print len(q)
Или позвоните count()
:
print User.objects.filter(email = 'foo@bar.com').count()
Первый метод (len
) будет быстрее, если вы уже оценили QuerySet
(так как он просто подсчитывает количество элементов в списке, эффективно); последнее (count()
) будет быстрее, если вы не оценили QuerySet
, поскольку Django будет выполнять SELECT COUNT(*)
за кадром, и вы избегаете загрузки всех данных в память.
В качестве отступления - зачем вы направляете их на /home/
, если адрес электронной почты не совпадает, и на /home/login/
, если их учетные данные не работают? Я бы подумал, что для этих двух случаев имеет смысл перенаправить их в одно и то же место.