如何在Django的utils.py中获取当前登录用户request.user的budget_id字段
实现方案
Django的request对象仅在视图层的请求生命周期内可直接获取,utils.py模块默认无权限直接访问该对象,你可以通过显式传参的方式实现需求,以下是两种可行方案:
方案1:将用户对象传入Calendar类初始化(推荐)
适合整个Calendar类的多个方法都需要用到用户信息的场景:
第一步:修改utils.py中的Calendar类
class Calendar(HTMLCalendar): # 新增user参数,实例化时传入当前登录用户 def __init__(self, year=None, month=None, user=None): self.year = year self.month = month self.user = user # 将用户对象存储为实例属性 super(Calendar, self).__init__() def formatday(self, day, events): # 直接从实例属性读取budget_id budget_id = self.user.budget_id # 剩余业务逻辑...
第二步:在views.py中实例化Calendar时传参
# 你的视图函数中实例化Calendar的位置 def your_view_func(request): # 把request.user作为参数传入 cal = Calendar(year=2024, month=10, user=request.user) # 后续调用formatday等方法的逻辑...
方案2:调用formatday时直接传参
如果仅在formatday方法中需要用到用户信息,可以只修改该方法的参数:
第一步:修改utils.py中的formatday方法
class Calendar(HTMLCalendar): def __init__(self, year=None, month=None,): self.year = year self.month = month super(Calendar, self).__init__() # 新增user参数 def formatday(self, day, events, user): budget_id = user.budget_id # 剩余业务逻辑...
第二步:在调用formatday时传入当前用户
# 调用formatday的位置,传入request.user cal.formatday(day=15, events=your_event_list, user=request.user)
注意:不建议使用线程本地存储(threadlocal)的方式全局获取request对象,该方案存在线程安全风险,多worker部署时容易出现用户数据串扰的问题,优先选择显式传参的方案更稳定可控。
内容的提问来源于stack exchange,提问作者LukarisPL Zapotoczny
相关产品推荐
相关产品推荐

