Django url模式多个参数(没有pk)

时间:2017-09-20 09:25:24

标签: django parameters django-rest-framework url-pattern

我是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"
课堂上的

也适用。

4 个答案:

答案 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):
    ...