我是Django框架的新手,有一件事困扰着我。
我想要一个简单的休息呼叫:
www.abc.com/users/1/cantonments/1/
如果我使用' pk'在url模式中,一切都开箱即用(pk,pk1,pk2 ....)。 但是我有一些权限功能,它们希望kwargs中的参数形式为“upk'和' cpk'供用户和进驻。因此,如果我将 pk 更改为 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的条目?
P.S。错误:
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.
修改
我的观点很简单:
# 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: 使用
lookup_url_kwarg = "cpk"
课堂上的也适用。
答案 0 :(得分:0)
您可能在视图中访问pk变量
urls.py
url(r'^users/(?P<upk>[0-9]+)/cantonments/(?P<cpk>[0-9]+)/$',
views.CantonmentDetail.as_view()),
views.py
class your_class_name(ListView):
def view_name(self):
upk=self.kwargs['upk']
cpk=self.kwargs['cpk']
print upk, cpk
...
希望这有助于你
答案 1 :(得分:0)
您可以使用get方法发送可选的pk,例如
www.abc.com/users/1/cantonments/?&upk=1
和url应为
url(r'^users/(?P<pk>[0-9]+)/cantonments/$',
views.CantonmentDetail.as_view()),
和views.py
def view_name(request, pk=None):
upk = request.GET.get('upk')
答案 2 :(得分:0)
upk对查找没有任何影响(因为主键通过设计识别单个对象)。
因此,对于视图,lookup_field需要设置为'cpk',一切正常。
答案 3 :(得分:0)
您是否使用变量的新名称更改了视图? 如果你有这样的网址:
url(r'^users/(?P<upk>[0-9]+)/cantonments/(?P<cpk>[0-9]+)/$',
views.CantonmentDetail.as_view()),
你应该像这样更新你的观点:
def view_name(request, upk=None, cpk=None):
...