覆盖get_object()并手动设置PK

时间:2014-03-07 22:00:47

标签: python django

我有一个DetailView课程,其中我没有通过pk或slug。因此,我试图覆盖get_object(self)并手动放置查询过滤器项(在我的情况下是当前登录的用户)。但是,我没有成功:

class ViewSpecialUser(LoginRequiredMixin, DetailView):
    model = SpecialUser
    print(self)

    def get_object(self):

        object = super(ViewSpecialUser, self).get_object(queryset)
        object.queryset = queryset.filter(pk=self.request.user.pk)
        return object

    def get_context_data(self, **kwargs):
        context = super(ViewSpecialUser, self).get_context_data(**kwargs)
        return context

2 个答案:

答案 0 :(得分:6)

只需返回Model的实例:

def get_object(self):
    return self.model.objects.get(pk=self.request.user.pk)

答案 1 :(得分:3)

将使用可选的get_object参数调用

queryset,您忽略该参数,并且您可能会收到TypeError: get_object() takes exactly 1 argument (2 given)个异常。如果在您的特定情况下没有get_object参数调用queryset时,甚至,那么您实际上正在尝试引用相同的{{} 1}}你从未在第一时间定义的变量,所以你可能会得到queryset例外。

如果没有提供NameError: global name 'queryset' not defined sets up a default for the queryset parameter SingleObjectMixin的{​​{1}},那么你应该这样做:

get_object

然后,您应该使用def get_object(self, queryset=None): ... if queryset is None: queryset = self.get_queryset() ... (作为参数或来自queryset)来查找您的用户:

self.get_queryset()

当然,这假设1) return queryset.get(pk=self.request.user.pk) 是您首先在身份验证中使用的用户模型,或者2)SpecialUser与您的实际用户模型同步是