2017-09-20 5 views
0

Ich bin neu im Django Framework und eine Sache stört mich.Django url Muster mehrere Parameter (ohne pk)

Ich möchte eine einfache Rast Call:

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

Wenn ich aus der Box (pk, PK1, PK2 ....) 'pk' in der URL-Muster alles verwenden funktioniert. Aber ich habe eine Berechtigungsfunktionalität, die die Parameter in Kwargs in der Form 'upk' und 'cpk' für Benutzer und Quartier erwartet. Also, wenn ich pk zu upk ändern, bricht alles. Irgendwie braucht die URL EINEN PK.

Dies funktioniert:

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

Diese sieht nicht:

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

Gibt es eine Möglichkeit, ein URL-Muster zu haben, die nicht mit pk einen Eintrag benötigt?

P. S. Der Fehler:

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:

Meine Ansicht ist einfach:

# 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:

I get_queryset Objekt zu erhalten geändert und es funktioniert.

def get_object(self): 
    queryset = self.filter_queryset(self.get_queryset()) 
    obj = queryset.get(pk=self.kwargs['cpk']) 
    return obj 

Edit3: Mit

lookup_url_kwarg = "cpk" 

in der Klasse als gut funktioniert.

+0

zeigen Sie Ihre Ansichten? – zaidfazil

+0

Ihre View.py kann Problem bekommen Argument kann dies hinzufügen – Robert

Antwort

0

Kann Ihrer Meinung nach sein, das Sie pk Variable

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

Hoffnung dies hilft Ihnen

+0

Das sieht wirklich vielversprechend aus. Wie kann ich upk = None usw. zu meiner generischen klassenbasierten Ansicht hinzufügen? Schätzen Sie Ihre Hilfe. – Markus

+0

Siehe aktualisierte Antwort –

0

Sie greifen schicken optional pk mit Get-Methode mit Ihrer URL wie

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

und URL sollte

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

und Ansichten sein.py

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

Das upk macht keinen Unterschied zur Suche (weil ein Primärschlüssel ein einzelnes Objekt durch Design identifiziert).

Also für die Ansicht muss die lookup_field auf "cpk" eingestellt werden und alles funktioniert.

0

Haben Sie Ihre Sicht mit den neuen Namen der Variablen geändert? Wenn Sie url wie dieses:

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

Sie shouls Ihre Ansicht wie folgt aktualisieren:

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