2017-09-20 7 views
0

Je suis nouveau dans le Framework Django et une chose me dérange.Django url pattern multiple Paramètres (sans pk)

Je veux simple appel de repos:

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

Si j'utilise 'pk' dans le tout motif url fonctionne hors de la boîte (pk, PK1, PK2 ....). Mais j'ai une fonctionnalité d'autorisation qui attend les paramètres dans kwargs sous la forme 'upk' et 'cpk' pour l'utilisateur et le cantonnement. Donc, si je change pk à upk tout se brise. D'une certaine manière, l'url a besoin d'un pk.

Cela fonctionne:

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

Ce ne marche pas:

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

Est-il possible d'avoir un modèle d'URL qui n'a pas besoin d'une entrée avec pk?

P.S. L'erreur:

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:

Mon point de vue est simple:

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

J'ai changé get_queryset pour obtenir l'objet et il fonctionne.

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

Edit3: En utilisant

lookup_url_kwarg = "cpk" 

dans la classe fonctionne aussi bien.

+0

montrer votre point de vue? – zaidfazil

+0

votre view.py peut problème obtenir l'argument peut ajouter ceci – Robert

Répondre

0

Peut être à votre avis vous accédez variable 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 
     ... 

Espoir cela vous aide

+0

Cela semble vraiment prometteur. Comment puis-je ajouter upk = None etc à ma vue de classe générique? Appréciez votre aide. – Markus

+0

Voir la mise à jour –

0

Vous pouvez envoyer pk optionnel utilisant la méthode get avec votre URL comme

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

et url doit être

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

et vues.py

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

L'ascendant ne fait aucune différence dans la recherche (car une clé primaire identifie un seul objet par conception). Donc pour la vue, le lookup_field doit être réglé sur 'cpk' et tout fonctionne.

0

Avez-vous modifié votre affichage avec les nouveaux noms des variables? Si vous avez URL comme ceci:

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

Vous shouls mettez à jour votre point de vue comme ceci:

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