Django投掷'无法在没有主键的情况下强制执行save()中的更新'用户尝试登录时出错



我正在尝试登录用户以显示网页。我创建了自己的登录和注册表单,并处理自己的登录身份验证。我使用django的login()方法。

现在我知道了,因为我没有使用django登录和身份验证,所以我需要创建一个名为last_login的额外字段,我已经这样做了。这是我的django型号

class SignUp(models.Model):
password = models.CharField(null=False, max_length=50)
username = models.EmailField(null=False)
last_login = models.DateTimeField(auto_now=True, blank=True)

当用户点击/注册url时,这将为用户注册。下面是该模型的postgres表。

Column   |           Type           | Modifiers 
------------+--------------------------+-----------
id         | integer                  | 
username   | character varying(100)   | 
password   | character varying(50)    | 
last_login | timestamp with time zone | 

但是,当用户尝试使用他们的用户名和密码登录时(在访问/登录url后(,我会得到以下错误

ERROR 2018-07-22 22:38:18,625 django.request Internal Server Error: /login
Traceback (most recent call last):
File "/usr/lib/python2.7/site-packages/django/core/handlers/exception.py", line 41, in inner
response = get_response(request)
File "/usr/lib/python2.7/site-packages/django/core/handlers/base.py", line 249, in _legacy_get_response
response = self._get_response(request)
File "/usr/lib/python2.7/site-packages/django/core/handlers/base.py", line 187, in _get_response
response = self.process_exception_by_middleware(e, request)
File "/usr/lib/python2.7/site-packages/django/core/handlers/base.py", line 185, in _get_response
response = wrapped_callback(request, *callback_args, **callback_kwargs)
File "/usr/lib/python2.7/site-packages/django/views/decorators/csrf.py", line 58, in wrapped_view
return view_func(*args, **kwargs)
File "/root/Utora/kriktona/webhook/ui_server.py", line 94, in authenticate
login(request, user.first())
File "/usr/lib/python2.7/site-packages/django/contrib/auth/__init__.py", line 156, in login
user_logged_in.send(sender=user.__class__, request=request, user=user)
File "/usr/lib/python2.7/site-packages/django/dispatch/dispatcher.py", line 193, in send
for receiver in self._live_receivers(sender)
File "/usr/lib/python2.7/site-packages/django/contrib/auth/models.py", line 25, in update_last_login
user.save(update_fields=['last_login'])
File "/usr/lib/python2.7/site-packages/django/db/models/base.py", line 806, in save
force_update=force_update, update_fields=update_fields)
File "/usr/lib/python2.7/site-packages/django/db/models/base.py", line 836, in save_base
updated = self._save_table(raw, cls, force_insert, force_update, using, update_fields)
File "/usr/lib/python2.7/site-packages/django/db/models/base.py", line 894, in _save_table
raise ValueError("Cannot force an update in save() with no primary key.")
ValueError: Cannot force an update in save() with no primary key.

这是下面登录的验证码

@csrf_exempt
def authenticate(request):
if request.method == "POST":
user_request = request.POST
user = SignUp.objects.filter(username=user_request.get("username"))
if user:
password_db = str(user.values("password")[0]["password"])
if password_db == user_request.get("password"):
login(request, user.first())
redirect("/home")
else:
return HttpResponse("Failure")
else:
return HttpResponse("Failure")
else:
print("show login page")
return render(request, 'login.html')

我不太确定我哪里错了。

您可以通过更改轻松修复它

user = SignUp.objects.filter(username=user_request.get("username"))

user = SignUp.objects.filter(username=user_request.get("username"), password=user_request.get("password"))
if user:
return login(request, user)

然而,正如评论中的人所说,你应该强烈阅读这篇文章,因为contrib allready拥有你所需要的一切,并对其进行加密,它比你的更安全。https://docs.djangoproject.com/en/2.0/ref/contrib/auth/#django.contrib.auth.models.User.last_login

最新更新