Вход в систему Django — «Невозможно принудительно обновить в save() без первичного ключа»

#django #django-authentication

Вопрос:

Я реализовал стандартный вход в систему Django следующим образом:

 from django.contrib.auth import authenticate, login, logout

def login_request(request):
    username = password = ""
    if request.POST:
        username = request.POST["username"].lower()
        password = request.POST["password"]
        user = authenticate(username=username, password=password)
        if user is not None:
            if user.is_active:
                login(request, user)
                return redirect("../..")
        return render(request, "login.html", context={"error": "TRUE"})
    return render(request, "login.html", context={"error": "FALSE"})
 

Для большинства пользователей это сработало нормально. Тем не менее, для некоторых пользователей это приводило к следующей ошибке:

 Traceback (most recent call last):
  File "/home/ubuntu/qq_api/venv/local/lib/python3.6/site-packages/django/core/handlers/exception.py", line 47, in inner
    response = get_response(request)
  File "/home/ubuntu/qq_api/venv/local/lib/python3.6/site-packages/django/core/handlers/base.py", line 179, in _get_response
    response = wrapped_callback(request, *callback_args, **callback_kwargs)
  File "/home/ubuntu/qq_api/core/views.py", line 110, in login_request
    login(request, user)
  File "/home/ubuntu/qq_api/venv/local/lib/python3.6/site-packages/django/contrib/auth/__init__.py", line 132, in login
    user_logged_in.send(sender=user.__class__, request=request, user=user)
  File "/home/ubuntu/qq_api/venv/local/lib/python3.6/site-packages/django/dispatch/dispatcher.py", line 179, in send
    for receiver in self._live_receivers(sender)
  File "/home/ubuntu/qq_api/venv/local/lib/python3.6/site-packages/django/dispatch/dispatcher.py", line 179, in <listcomp>
    for receiver in self._live_receivers(sender)
  File "/home/ubuntu/qq_api/venv/local/lib/python3.6/site-packages/django/contrib/auth/models.py", line 20, in update_last_login
    user.save(update_fields=['last_login'])
  File "/home/ubuntu/qq_api/venv/local/lib/python3.6/site-packages/django/contrib/auth/base_user.py", line 67, in save
    super().save(*args, **kwargs)
  File "/home/ubuntu/qq_api/venv/local/lib/python3.6/site-packages/django/db/models/base.py", line 751, in save
    force_update=force_update, update_fields=update_fields)
  File "/home/ubuntu/qq_api/venv/local/lib/python3.6/site-packages/django/db/models/base.py", line 789, in save_base
    force_update, using, update_fields,
  File "/home/ubuntu/qq_api/venv/local/lib/python3.6/site-packages/django/db/models/base.py", line 852, in _save_table
    raise ValueError("Cannot force an update in save() with no primary key.")

Exception Type: ValueError at /login/
Exception Value: Cannot force an update in save() with no primary key.
 

Эта ошибка возвращается обратно в in . user.save(update_fields=['last_login']) django/contrib/auth/models.py Я не смог определить, почему возникает эта ошибка и почему она происходит с некоторыми пользователями, а не с другими. Я внимательно посмотрел и не смог найти ничего, что отличало бы пользователей, у которых была эта проблема, от тех, у кого ее не было.

Комментарии:

1. Пожалуйста, опубликуйте полную обратную связь.

2. Если вы создали свой собственный сервер аутентификации, это тоже может помочь поделиться им.

3. @WillemVanOnsem Добавил полную обратную связь. Я просто использую пакеты django.contrib.auth для аутентификации.

Ответ №1:

Исправление в функции входа в систему:

Удалить username=password=""

Комментарии:

1. Это ничего не исправило

2. Прости! но на месте request.post: этого должно быть request.method=="POST":