如何使用当前登录用户作为 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?