在Django视图类中从URL访问主键

33

我在Django应用程序中将URL模式映射到自定义视图类,如下所示:

url( r'^run/(?P<pk>\d+)/$', views.PerfRunView.as_view( ))
问题是,我无法弄清如何从URL模式字符串中访问'pk'以便在视图类中检索基于其数据库ID的特定模型对象。我已经搜索过谷歌、查看了Django文档、在Stack Overflow上进行了搜索,但都没有找到令人满意的答案。
有人可以告诉我吗?

1
这有帮助吗? - Ankur Gupta
1
阅读第二个注意事项:https://docs.djangoproject.com/en/1.4/topics/class-based-views/#performing-extra-work - iMom0
@Ankur Gupta 感谢提供的链接,但我仍然不是完全清楚。它是self.kwargs的一部分吗?我以为我已经掌握了Django,直到我接触到基于类的视图。我根本不理解它们。 - Luke
1
@luke,基于类的视图只是一种抽象,我个人觉得很烦人,所以坚持使用函数。我不认为它们会有太大帮助。你并不需要使用它。使用简单的函数对抗URL也可以很好地工作。 - Ankur Gupta
4个回答

77
在基于类的视图中,URL 中的所有元素都被放置在 self.args(如果它们是非命名组)或 self.kwargs(对于命名组)中。因此,在您的视图中,您可以使用 self.kwargs ['pk']

1
我已经解决了。我甚至对Django视图类的工作原理有了更好的理解。 - Luke

15

要在视图中访问主键,使用

post.pk
Class_name.objects.get(pk=self.kwargs.get('pk'))

1

这是一个基于Django Rest Framework的示例,用于通过URL中的pk检索对象:

views.py

class ContactListView(generics.ListAPIView):
    queryset = Profile.objects.all()
    serializer_class = UserContactListSerializer

    def get(self, request, pk, *args, **kwargs):
        contacts = Profile.objects.get(pk=pk)
        serializer = UserContactListSerializer(contacts)
        return Response(serializer.data)

urls.py

    url(r'^contact_list/(?P<pk>\d+)/$', ContactListView.as_view())

0

正如许多人所说,self.kwargs 运行良好。 它特别有助于 self.get_queryset() 函数,不像 listcreate 那样,pk 更好。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接