Сложность в том, что обычно вы справляетесь с этим, создавая пользовательский бэкэнд аутентификации, который реализует authenticate
и get_user
. Однако подпись функции для authenticate
:
def authenticate(self, username=None, password=None):
Везде в Django, который будет вызывать это, будет передаваться только 2 параметра, имя пользователя и пароль. Это означает, что использование любой из общих форм аутентификации и таких вещей, как интерфейс администратора, будет нарушено, если это будет сделано любым другим способом.
Единственный обходной путь, который я мог видеть, и это отчасти схематично, это если имя пользователя должно быть напечатано как одна запись со строкой «First Last» (разделенной пробелом) вместо имени пользователя. Затем вы можете выделить его и использовать это значение ...
(это все не проверено, но вы поняли)
class FirstLastNameBackend(object):
def authenticate(self, username=None, password=None):
first, last = username.split(' ', 1)
try:
user = User.objects.get(first_name=first, last_name=last)
if user:
# Check if the password is correct
# check if the user is active
# etc., etc.
return user
except:
pass
return None
def get_user(self, user_id):
try:
return User.objects.get(pk=user_id)
except:
return None
В django doc содержится много полезной информации о создании пользовательского бэкэнда: Авторизация пользователя с пользовательским бэкэндом
В примечании, к которому следует позаботиться, относятся фамилии, в которых есть пробел (ы), например "de la Cruz". Если вы укажете 1 для maxsplit в функции split
, вы избежите этой проблемы.