Я не понимаю некоторых основ, связанных с пользовательскими моделями пользователей.
Я хотел удалить пользователя. После некоторой борьбы я пришел к следующему результату: views.py
the_user = get_user_model()
@login_required
def del_user(request):
email = request.user.email
the_user.objects.filter(email=email).delete()
messages.warning(request, "bruker slettet.")
return redirect("index")
Но я действительно не понимаю. В строке
email = request.user.email.
Почему это не так
email = request.the_user.email
Здесь есть некоторые основы, которые я не понимаю в отношении пользовательских моделей пользователей. Это происходит потому, что пользователь ссылается на AbstractBaseUser?
Прошу извинить меня за этот вопрос.
request
является экземпляром объекта HttpRequest
. Он представляет текущий полученный запрос. AuthenticationMiddleware
аутентифицирует пользователя, сделавшего запрос (на основе cookies или как вы это настроили), и добавляет к нему атрибут request.user
, чтобы ваш код мог узнать, кто является текущим пользователем, сделавшим запрос.
То, что вы называете the_user
, - это User
класс модели. Это произвольное имя, которое вы дали переменной в своем коде.
К вашему сведению, объект request.user
уже является полноценным экземпляром User
, у которого уже есть метод delete
. Вам не нужно снова искать того же пользователя через класс модели the_user
, вы можете просто сделать:
@login_required
def del_user(request):
request.user.delete()
messages.warning(request, "bruker slettet.")
return redirect("index")
Атрибут .user
задается атрибутом AutenticationMiddleware
[Django-doc]. Таким образом, он проверяет переменные сессии на наличие ключа с именем _auth_user_id
, и если он содержит первичный ключ пользователя, то может получить соответствующий объект пользователя (на основе выбранной вами модели пользователя).
Таким образом, это не имеет никакого отношения к имени модели (the_user
, кстати, не самое удачное имя, поскольку классы пишутся на PascalCase
), имя всегда .user
, или .auser
, если вы хотите получить его асинхронным способом.
Объект .user
также извлекается беззаботно: пока вам не нужно получить доступ к атрибуту request.user
, вызвать метод или сделать что-то еще, он не извлекается.