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

Posted

技术标签:

【中文标题】如何使用当前登录用户作为 Django DetailView 的 PK?【英文标题】:How to use current logged in user as PK for Django DetailView? 【发布时间】:2013-02-19 08:26:52 【问题描述】:

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

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

访问/user会得到当前登录用户的DetailView /user/edit 将显示当前登录用户的 UpdateView

我尝试在Detail.as_view() 调用中对pk= 进行硬编码,但它报告无效关键字。

如何在 URL conf 中指定?

我的示例代码在访问/user URL 时显示 PK required 错误:

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

【问题讨论】:

【参考方案1】:

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

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,这使它更加简洁,并清楚地说明了它的真正含义:父视图的一个特例。

【讨论】:

只是一个评论,因为您似乎在比较您的方法和我的方法:直接子类化视图是更简单,但不太可重用。一个 mixin 可以重复使用,混合 (doh) 与多个视图,共享相同的基本行为:3 当然。我并没有将它们进行比较,因为其中一个优于另一个,我只是说每个都有一个更适合的用例。【参考方案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

【讨论】:

【参考方案3】:

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

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

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

【讨论】:

【参考方案4】:

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

【讨论】:

谢谢你,但我指的不是模板。我想在模板之外完成它。

以上是关于如何使用当前登录用户作为 Django DetailView 的 PK?的主要内容,如果未能解决你的问题,请参考以下文章

如何将表单中的用户字段设置为当前登录的用户?

Django:如何在javascript中访问当前登录用户的ID?

如何在 Django 的 CreateView 提交操作中保存当前登录的用户名?

基于当前用户登录的 Django 数据库路由

在Django中获取当前用户登录信号

Django:如何获取当前用户的组 ID