如何在 Django DetailView 中使用来自 URL 和请求的值?

Min*_*nnR 3 django url if-statement detailview

我在 django views.py 中有一个 DetailView,我希望能够将来自 url ex:localhost:8000/myapp/details/3/ 的 pk 值和 request.user.id 与 if 语句进行比较。

视图中无外乎以下几行代码:

class UserDetail(DetailView):
    model = Profile
    template_name = 'details.html'
Run Code Online (Sandbox Code Playgroud)

任何帮助将非常感激。

Tom*_* Un 6

在 DetailView 中,您可以访问self.request,self.argsself.kwargs!

参考:https : //docs.djangoproject.com/en/dev/topics/class-based-views/generic-display/#dynamic-filtering

在您的 urls.py 中添加如下内容:

urlpatterns = [
    #...
    url(r'^details/(?P<pk>[0-9]+)/$', UserDetail.as_view()),
]
Run Code Online (Sandbox Code Playgroud)

并且您的 UserDetail 现在可以访问request.user.id和 pk by self.kwargs['pk'](请参阅上面的参考资料:kwargs 是基于名称的,因此您可以访问它,self.kwargs['name']而 self.args 是基于位置的,因此您可以通过 self.args[0] 访问它)。

如果我正确理解您的问题,您正在尝试操作 DetailView 的查询集,仅在当前登录用户尝试访问其页面时才返回数据。如果这是真的,那么你应该在你的类中覆盖 get_queryset ,就像这样:

def get_queryset(self):
    if self.kwargs['pk'] == self.request.user.id:
        return Profile.objects.filter(id=self.request.user.id)
    else:
        return Profile.objects.none()
Run Code Online (Sandbox Code Playgroud)