2017-09-20 76 views
0

我是Django框架的新手,有一件事讓我煩惱。Django url pattern multiple參數(不包括pk)

我想要一個簡單的REST調用:

www.abc.com/users/1/cantonments/1/ 

如果我在URL模式都使用 'PK' 開箱(PK,PK1,PK2 ....)的。 但我有一些權限的功能,期望在形式'upk'和'cpk'爲用戶和營地kwargs中的參數。所以,如果我改變pkupk一切都打破。不知怎的,該網址需要ONE 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()), 

有沒有辦法有一個不需要與PK一個條目的URL模式?

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

顯示您的看法? – zaidfazil

+0

你的view.py可能會問題得到參數可以加上這個 – Robert

回答

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 
     ... 

希望這可以幫助你

+0

這看起來很有前途。我怎樣才能將upk = None等添加到我的基於類的視圖中? 感謝您的幫助。 – Markus

+0

查看更新的答案 –

0

您可以發送可選的PK使用get方法與你的網址一樣

www.abc.com/users/1/cantonments/?&upk=1 

和URL應該是

url(r'^users/(?P<pk>[0-9]+)/cantonments/$', 
views.CantonmentDetail.as_view()), 

和看法。py

def view_name(request, pk=None): 
    upk = request.GET.get('upk') 
0

upk對查找沒有任何影響(因爲主鍵通過設計標識單個對象)。

因此,對於視圖,lookup_field需要設置爲'cpk',並且一切正常。

0

您是否用變量的新名稱更改了視圖? 如果你有網址是這樣的:

url(r'^users/(?P<upk>[0-9]+)/cantonments/(?P<cpk>[0-9]+)/$', 
views.CantonmentDetail.as_view()), 

您shouls更新您的看法是這樣的:

def view_name(request, upk=None, cpk=None): 
    ...