在定义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')),
)`
答案 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模式的其他示例列表。