如何避免在 Django 中使用 context_processors.py 时在登录页面上请求用户?

Posted

技术标签:

【中文标题】如何避免在 Django 中使用 context_processors.py 时在登录页面上请求用户?【英文标题】:How to avoid requesting user on login page while using context_processors.py in Django? 【发布时间】:2020-06-02 10:10:22 【问题描述】:

我想将带有用户信息的变量(通过 OneToOneField 链接到 Clients 模型)传递到 django.contrib.auth.modelsbase.html 文件。

所以,我用下面的代码创建了一个context_processors.py

from django.contrib.auth.models import User

    def userData(request):  
        user = request.user
        u = User.objects.get(username=user)
        us = u.clients.first_name
        uv = u.clients.avatar
        return 
            'u': u,
            'us': us,
            'uv': uv
        

一切正常,直到我退出。

当我再次尝试登录时,我得到了accounts/login url 并得到一个

DoesNotExist at /accounts/login/
User matching query does not exist.

【问题讨论】:

这能回答你的问题吗? How do I get the object if it exists, or None if it does not exist? 根据您的代码,看起来User 可以有多个 Clients? @WillemVanOnsem 我在我的models.py 上使用 OneToOneField。所以,我相信它不能。再说一次,我是 Django/Python 的新手。 @JoãodeSousa:是的,那么这确实是不可能的。但是,最好将模型重命名为Client(模型通常被赋予单数名称,或相关名称为client)。从现在开始它“暗示”它返回多个(因为clients 是复数)。 【参考方案1】:

你的request.user已经是User,所以再次获取它没有多大意义。

您可以简单地检查用户是否已登录:

def userData(request):
    if request.user.is_authenticated:
        return 
            'u': request.user,
            'us': request.user.clients.first_name,
            'uv': request.user.clients.avatar,
        
    return 

注意:名称clients复数,因此暗示了Clients 的集合。通常模型名称是单数(所以Client而不是Clients),如果您自己指定,OneToOneField 的相关名称应该是单数也是。

【讨论】:

这成功了!谢谢你,也谢谢你关于重命名我的模型的建议!

以上是关于如何避免在 Django 中使用 context_processors.py 时在登录页面上请求用户?的主要内容,如果未能解决你的问题,请参考以下文章

如何在Django视图中使用request.path get_context_data?

Django_内置Admin

如何在 Django get_context_data 方法中访问模型的外国座位的元素?

如何避免 Python 模块系统中的命名冲突?

如何在ListView中正确使用get_context_data来获取Django中的相关实例

在 django 中使用自定义类视图让我出错