2017-09-20 41 views
0

私はDjango Frameworkを初めて使いました。Django URLパターン複数のパラメータ(pkなし)

私は、簡単な休息を呼び出したい:

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

私はURLパターンに 'PK' を使用している場合は、すべてが箱から出して動作します(PK、PK1、PK2を....)。 しかし、私はいくつかのパーミッション機能を持っていますが、ユーザーとキャノンのために 'upk'と 'cpk'の形式でkwargsのパラメータが必要です。だから私が変更した場合pkupkすべてが壊れます。どういうわけか、URLには1つのpkが必要です。

これは動作します:

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

このdoesntの:

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

はPKで1つのエントリを必要としないURLパターンを持ってする方法はありますか?

P.エラー:

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:クラスの

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

役立ちますあなたのURLにgetメソッドを使用するオプションのpk

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は、主キーが1つのオブジェクトを設計上識別するため、ルックアップに何の違いもありません。

したがって、lookup_fieldは 'cpk'に設定する必要があり、すべてが機能します。

0

変数の新しい名前でビューを変更しましたか?あなたはこのようなあなたのビュー更新shouls

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

:あなたはこのようなURLがある場合は

def view_name(request, upk=None, cpk=None): 
    ... 
関連する問題