6

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

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

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

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

如何在 URL conf 中指定它?

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

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

4 回答 4

8

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

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

比 mixin 方法更清洁、更简单且更符合基于类的视图的精神。

编辑:澄清一下,我认为pk应该在 urlconf 中分别定义两种不同的 URL 模式(即一个带有 a 而另一个没有)。因此它们也可以由两个不同的视图提供服务,特别是因为这使代码更清晰。在这种情况下,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,这使得它更加清晰,并清楚地说明了它的真正含义:父视图的一个特例。

于 2013-03-05T11:25:51.657 回答
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
于 2013-03-05T04:52:22.150 回答
0

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

于 2013-03-05T03:39:56.967 回答
0

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

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

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

于 2013-03-05T03:41:54.290 回答