【问题标题】:Context processor ('AnonymousUser' object is not iterable)上下文处理器('AnonymousUser' 对象不可迭代)
【发布时间】:2021-07-27 07:47:30
【问题描述】:

在我的上下文处理器.py 文件中,我根据用户过滤表。这一切都很好:

def subject_renderer(request):
    return {"Calicount": Tools_Calibrated.objects.filter(
        user=request.user, calibrated=True, issued=True).count(),
    }

当我注销并尝试重新登录时出现问题。因为登录时没有经过身份验证的用户,我无法在上下文处理器中调用查询。

问题:为什么我的上下文处理器函数在我没有调用登录视图模板中的键时被调用。我知道如何使用模板来解决这个问题,但我想知道如何使用上下文处理器来解决它。基本上从一个角度省略它。

提前谢谢你

【问题讨论】:

  • 向我们展示完整的错误回溯!
  • 上下文处理器总是被应用,即使你没有使用Calicount。然后,处理像 Willem Van Onsem 这样的不受欢迎的案例就是要走的路。
  • 另外,有一个你不想在任何地方应用的逻辑似乎比上下文处理器更好地使用标签 (docs.djangoproject.com/en/3.2/howto/custom-template-tags/…)

标签: python django


【解决方案1】:

有可能是用户没有登录,所以在这种情况下你不能通过Calicount

因此,您应该使用以下方式实现上下文处理器:

def subject_renderer(request):
    if request.user.is_authenticated:
        return {
            'Calicount': Tools_Calibrated.objects.filter(user=request.user, calibrated=True, issued=True).count()
        }
    return {}

【讨论】:

  • 是的,这正是我所做的,谢谢。但是我仍然想知道是否有代码可以用来省略上下文处理器函数/函数本身的编码条件?
  • @Andre:但在这里我们会检查用户是否在上下文处理器中进行了身份验证。正如文档所说:每个处理器都按顺序应用。,因此您不能为某些视图“禁用”上下文处理器,您需要编写简单地返回空字典的逻辑,这样没有任何内容添加到上下文中。
  • 好的,谢谢,我想我天真地认为您能够以类似于模板标签的功能为目标。也许在函数内的 init 方法上。我从来没有正确阅读过文档。感谢您的回复,对于这个幼稚的问题感到抱歉!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2020-11-06
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-08-27
相关资源
最近更新 更多