我是 Django 框架的新手,有一件事困扰着我。
我想要一个简单的休息电话:
www.abc.com/users/1/cantonments/1/
如果我在 url 模式中使用“pk”,则一切都可以开箱即用(pk、pk1、pk2...)。
但我有一些权限功能,需要 kwargs 中的参数以“upk”和“cpk”形式用于用户和营地。所以如果我改变pk to upk一切都破裂了。不知何故,该网址需要一个 pk。
这有效:
url(r'^users/(?P<pk>[0-9]+)/cantonments/(?P<cpk>[0-9]+)/$',
views.CantonmentDetail.as_view()),
这不会:
url(r'^users/(?P<upk>[0-9]+)/cantonments/(?P<cpk>[0-9]+)/$',
views.CantonmentDetail.as_view()),
有没有一种方法可以让 url 模式不需要一个 pk 条目?
附:错误:
Expected view CantonmentDetail to be called with a URL keyword argument named "pk". Fix your URL conf, or set the `.lookup_field` attribute on the view correctly.
EDIT:
我的观点很简单:
# Authenticated User can show Cantonment Detail
class CantonmentDetail(generics.RetrieveAPIView):
serializer_class = serializers.CantonmentSerializer
permission_classes = [permissions.IsAuthenticated]
def get_queryset(self):
return Cantonment.objects.filter(pk=self.kwargs['cpk'])
Edit2:
我将 get_queryset 更改为获取对象并且它有效。
def get_object(self):
queryset = self.filter_queryset(self.get_queryset())
obj = queryset.get(pk=self.kwargs['cpk'])
return obj
Edit3:
Using
lookup_url_kwarg = "cpk"
在课堂上也有效。