#django #django-forms #django-authentication
#django #django-формы #django-аутентификация
Вопрос:
Должен ли я писать логику аутентификации в своих формах для обработки входа пользователя?
Например, я хотел бы отображать сообщения пользователю, если учетная запись еще не активирована. Для этого я сейчас делаю что-то вроде этого (ужасно, я знаю):
def login(request):
email = request.POST.get('email')
password = request.POST.get('password')
user = auth.authenticate(email=email, password=password)
if user is not None:
if user.is_active:
auth.login(request, user)
# etc
else:
# send "not activated message"
else:
# send "not found message"
Это намного уродливее, чем в реализации, но я избавлю Интернет от моей первоначальной попытки обработки форм в Django до того, как я изучил forms API.
В любом случае, важно иметь возможность сообщать пользователям, что их учетные записи еще не активны, если они попытаются войти в систему, чтобы они могли, по крайней мере, знать, что делать дальше. API форм, похоже, имеет здесь наибольший смысл: я мог бы выполнить простую проверку адреса электронной почты и пароля, затем выполнить фактическую проверку логики активации учетной записи в clean()
методе моей формы и отправить им сообщение, если есть проблема.
Есть ли какие-либо недостатки в этом?
PS: Я знаю, что Django поставляется с видом входа в систему и целыми девятью ярдами, но у меня есть конкретные потребности проекта, в которых мне нужно немного подправить аутентификацию и т.д., Поэтому, пожалуйста, не предлагайте «использовать включенный вид», на этот раз я не могу.
Ответ №1:
Как вы писали, вы можете создать форму входа, в которую вы можете добавить метод очистки:
class LoginForm(forms.Form):
email = ...
password = ...
def clean(self):
user = User.objects.filter(email=self.email)
if not user.exists():
raise forms.ValidationError("User does not exists")
if not user.is_active:
raise forms.ValidationError("This account is not active")
Это хороший способ решения этой проблемы.
Комментарии:
1. Вы правы, хотя выполнение аутентификации дважды кажется довольно странным.