2013-03-05 84 views
4

定义URL模式时,我应该使用正则表达式从URL中获取PK。如何将当前登录用户用作Django DetailView的PK?

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

  • 访问/user将获得的的DetailView当前登录的用户
  • /user/edit将呈现的UpdateView为当前登录的用户

我试图在Detail.as_view()硬编码pk=呼叫但它报告无效的关键字。

如何在URL配置文件中指定?

显示PK所需错误来访 /user URL时

我的示例代码:

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

发布您的代码 – catherine 2013-03-05 03:36:28

+0

添加了片段。 – radj 2013-03-05 04:33:16

回答

4

另一种做法将是压倒一切的DetailView子类的get_object方法,东西沿线:

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

基于类视图的精神比mixin方法更干净,更简单,更有精神。

编辑:为了澄清,我相信两个不同的URL模式(即一个pk和另一个没有)应该在urlconf中单独定义。因此,它们也可以由两种不同的视图提供服务,特别是因为这会使代码更清晰。在这种情况下,URL配置看起来是这样的:

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,这使得它更清洁,而且很清楚它到底是什么:一个特殊的父视图的情况。

+0

只是一个评论,因为你似乎正在比较你的方法,我的直接子类视图**更简单**,但少**可重用**。 mixin可以重复使用,混合(doh)和多个视图,共享相同的基本行为:3 – asermax 2013-03-05 13:59:17

+0

绝对如此。我并没有把它们比作一个优于另一个的意义上的比较,我的意思是说每个用例都有一个更好的用例。 – 2013-03-05 20:35:04

0

通用视图使用始终RequestContext。 Django文档中的this段说,当使用RequestContext和auth应用程序时,模板会通过代表当前用户登录的user变量。因此,请继续,并随时在您的模板中引用用户。

+0

谢谢你,但我不是指模板。我想让它在模板之外完成。 – radj 2013-03-05 04:30:44

0

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

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

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

2

据我所知,你不能在URL定义中定义它,因为你无法访问这些信息。

但是,您可以可以做的是创建您自己的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 
相关问题