如何使用当前登录用户作为Django DetailView的PK?

时间:2013-03-05 03:27:41

标签: python django django-urls django-class-based-views

在定义URL模式时,我应该使用正则表达式从URL获取PK。

如果我想要一个没有PK的URL,如果没有提供,它将使用当前登录的用户怎么办?例子:

  • 访问/user将获取当前登录用户的详细信息视图
  • /user/edit将显示当前登录用户的UpdateView

我尝试对pk=来电中的Detail.as_view()进行硬编码,但报告无效关键字。

如何在URL conf中指定它?

我的示例代码显示访问/user网址时出现PK所需的错误:

urlpatterns = patterns('',
    url(r'user/$', 
        DetailView.as_view(
            model=Account,
            template_name='user/detail.html')),
)`

4 个答案:

答案 0 :(得分:4)

另一种方法是覆盖get_object子类的DetailView方法,类似于以下内容:

class CurrentUserDetailView(UserDetailView):
    def get_object(self):
        return self.request.user

比mixin方法更清晰,更简单,更基于类的观点。

编辑:为了澄清,我认为应该在urlconf中单独定义两种不同的URL模式(即一个具有pk而另一个没有)。因此,它们也可以由两个不同的视图提供服务,特别是因为这使代码更清晰。在这种情况下,urlconf可能类似于:

urlpatterns = patterns('',
    url(r"^users/(?P<pk>\d+)/$", UserDetailView.as_view(), name="user_detail"),
    url(r"^users/current/$", CurrentUserDetailView.as_view(), name="current_user_detail"),
    url(r"^users/$", UserListView.as_view(), name="user_list"),
)

我已经更新了上面的示例,注意它继承了UserDetailView,这使得它更加清晰,并且清楚地说明了它的真实情况:父视图的特殊情况。

答案 1 :(得分:2)

据我所知,您无法在URL定义上定义,因为您无权访问该信息。

但是,可以做的是创建自己的mixin并使用它来构建行为符合您想要的视图。

你的mixin看起来像这样:

class CurrentUserMixin(object):
    model = Account

    def get_object(self, *args, **kwargs):
        try:
            obj = super(CurrentUserMixin, self).get_object(*args, **kwargs)
        except AttributeError:
            # SingleObjectMixin throws an AttributeError when no pk or slug
            # is present on the url. In those cases, we use the current user
            obj = self.request.user.account

        return obj

然后,制作自定义视图:

class UserDetailView(CurrentUserMixin, DetailView):
    pass

class UserUpdateView(CurrentUserMixin, UpdateView):
    pass

答案 2 :(得分:0)

通用视图始终使用RequestContext。 Django文档中的this段说当使用带有auth应用程序的RequestContext时,模板会传递一个user变量,该变量代表当前登录的用户。所以,请继续,并随时引用用户你的模板。

答案 3 :(得分:0)

您可以从request object获取当前用户的详细信息。如果您想查看其他用户的详细信息,可以将url作为参数传递。该网址将编码为:

url(r'user/(?P<user_id>.*)$', 'views.user_details', name='user-details'),

views.user_details第二个参数是user_id这是一个字符串(您可以更改url中的正则表达式来限制整数值,但参数仍然是string类型)。 Here是Django文档中url模式的其他示例列表。