Django:上下文处理器为不同的用户返回相同的值

时间:2018-04-15 04:10:15

标签: django django-models django-views

我有一个django应用程序,用户可以在其中回答问题,我在打印不同用户的观看次数时遇到了一些麻烦。

这是我的答案模型,

class Answer(models.Model):
    user = models.ForeignKey(settings.AUTH_USER_MODEL, default=1)
    content = models.TextField()
    views = models.IntergerField(default=1)

以下是我如何获得context_processors.py内每位用户的观看次数,

def all_views(request, pk=None):
    if pk:
        my_user = User.objects.get(id=pk)
    else:
        my_user = request.user
    user_views = Answer.objects.filter(user=my_user).aggregate(Sum('views'))
context = {'user_views': user_views }
return context

但问题是,它为每个用户返回request.user的观看次数。意味着我以abc (id=1)的身份登录,有20个视图&访问包含40个观看次数的xyz (id=2)个人资料,然后在xyz个人资料中显示20个观看次数,而不是40次。

为什么if pk:条件不起作用? &安培;我们如何解决这个问题?谢谢!

1 个答案:

答案 0 :(得分:1)

上下文处理器只传递一个参数 - request。您的上下文处理器永远不会收到pk参数,因此pk始终为None。如果pk是传递给您视图的关键字参数,那么您可以request对象访问它,如下所示:

pk = request.resolver_match.kwargs.get('pk')

(请参阅resolver_match的文档。)

那就是说,你可能不想这样做。请记住,上下文处理器是为所有视图运行的,其中许多视图可能具有与完全不同的模型对应的pk参数。这将导致各种各样的问题。

您应该考虑在适当的视图中执行此逻辑,而不是在上下文处理器中。上下文处理器仅对全局适用的上下文有用 - 这不是。