如何断开update_last_login连接?

6

我在Django中从头开始实现了自己的类。但是当我登录时,我遇到了以下错误:

此模型中不存在以下字段或m2m字段:last_login

我真的不想要last_login字段。

我做了一些研究,问题出在这里:contrib.aut.models.py

def update_last_login(sender, user, **kwargs):
    """
    A signal receiver which updates the last_login date for
    the user logging in.
    """
    user.last_login = timezone.now()
    user.save(update_fields=['last_login'])
user_logged_in.connect(update_last_login)

我找到了一个解决方法,但它并不是一个优雅的解决方案。我在我的models.py文件中添加了user_logged_in.disconnect(update_last_login),其中定义了我的User类。
是否有更好的解决方法?

你是从Django用户模型还是mixins继承的? - brsbilgic
不,我不会。如果我从Django的“User”继承,也会继承“last_login”字段(以及其他一些字段)。 - Brais Gabin
2个回答

6

不确定这是否与Django的新版本相关,但在我的情况下

user_logged_in.disconnect(update_last_login)

之前的方法无法使用,以下是适用于我(Django 2.1)的方法:

user_logged_in.disconnect(update_last_login, dispatch_uid='update_last_login')

在我的情况下也得到了确认。被接受的答案不起作用,但这个可以。 - MadMax1138
在Django 3.0中工作 - Francisco J Sucre G

0

目前在Django 1.7版本中...

我认为你所定义的解决方法是使用Django auth login()方法时唯一有效的解决方案(除了猴子补丁)。我会假设你正在使用标准的login()方法,而该方法引发了这个异常。

如果我们查看login方法的源代码, 我们会发现在该方法的结尾处调用了执行user_logged_in.send(sender=user.__class__, request=request, user=user)。除了像你所指出的断开连接,我们无法防止这个信号执行。

或者,我们可以猴子补丁login()方法来删除那个信号调用。

from django.contrib.auth import login

def monkey_patch_login(request, user):
    """
    Persist a user id and a backend in the request. This way a user doesn't
    have to reauthenticate on every request. Note that data set during
    the anonymous session is retained when the user logs in.
    """
    session_auth_hash = ''
    if user is None:
        user = request.user
    if hasattr(user, 'get_session_auth_hash'):
        session_auth_hash = user.get_session_auth_hash()

    if SESSION_KEY in request.session:
        if _get_user_session_key(request) != user.pk or (
                session_auth_hash and
                request.session.get(HASH_SESSION_KEY) != session_auth_hash):
            # To avoid reusing another user's session, create a new, empty
            # session if the existing session corresponds to a different
            # authenticated user.
            request.session.flush()
    else:
        request.session.cycle_key()
    request.session[SESSION_KEY] = user._meta.pk.value_to_string(user)
    request.session[BACKEND_SESSION_KEY] = user.backend
    request.session[HASH_SESSION_KEY] = session_auth_hash
    if hasattr(request, 'user'):
        request.user = user
    rotate_token(request)

login = monkey_patch_login

我们需要将猴子补丁代码放在需要调用login()方法的文件顶部。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接