如何避免在 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.models
到 base.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
可以有多个 Client
s?
@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
是复数,因此暗示了Client
s 的集合。通常模型名称是单数(所以Client
而不是),如果您自己指定,Clients
OneToOneField
的相关名称应该是单数也是。
【讨论】:
这成功了!谢谢你,也谢谢你关于重命名我的模型的建议!以上是关于如何避免在 Django 中使用 context_processors.py 时在登录页面上请求用户?的主要内容,如果未能解决你的问题,请参考以下文章
如何在Django视图中使用request.path get_context_data?
如何在 Django get_context_data 方法中访问模型的外国座位的元素?