2014-09-06 58 views
0

我在django views.py中有一个DetailView,我希望能够比较来自url ex:localhost:8000/myapp/details/3 /和带有if语句的request.user.id的pk值。如何使用URL中的值和Django DetailView中的请求?

没有什么比在视图中的代码下面几行:

class UserDetail(DetailView): 
    model = Profile 
    template_name = 'details.html' 

任何帮助将非常感激。

+1

你必须在此改变高清get_context_data(个体经营,** kwargs):你会得到PK = self.kwargs ['PK '] – 2014-09-06 11:27:23

回答

1

在DetailView中您可以访问self.requestself.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()), 
] 

和你UserDetail现在可以访问由self.kwargs['pk']request.user.id和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() 
+0

我在UserDetail类中使用了下面的代码,并且我得到一个NameError:name'self'is not defined ...... if self.kwargs ['pk']!= request.user.id: queryset = Profile.objects.none() – MiniGunnR 2014-09-10 05:05:07

+0

你也许忘了把自己传递给你的函数?像这样:def myFunction(self): – 2014-09-11 12:05:07

+1

我加入到我原来的答案中,检查这是否有助于更多。 – 2014-09-11 12:33:07

相关问题