web-dev-qa-db-fra.com

Vue attendue à appeler avec un argument de mot-clé URL nommé "pk"

J'écris un test pour un Django Rest Framework vue suivant de près le documentation de test

Voici mon test simple:

def test_patient_detail_api_opens(self):
    factory = APIRequestFactory()
    view =PatientDetailApi.as_view()
    request = factory.get(reverse('api_pacjent', kwargs={'pk' :1}))
    force_authenticate(request, user=self.user)
    response = view(request)
    self.assertEqual(response.status_code, 200)

Ce test échoue avec le message suivant:

AssertionError: Expected view PatientDetailApi to be called with a URL keyword argument named "pk". Fix your URL conf, or set the `.lookup_field` attribute on the view correctly.

Je n'arrive pas à comprendre pourquoi cela se produit et comment y remédier.

  • Le pk kwargs est là dans l'URL,
  • selon les documents, il n'est pas nécessaire d'ajouter le lookup-field valeur explicitement si elle vaut par défaut pk,
  • la vue s'ouvre correctement et pourtant ce test échoue ...

Quelqu'un peut-il expliquer pourquoi cette erreur se produit?

Voici le code pertinent:

le principal' url.py:

urlpatterns = [
    url(r'^pacjent/', include('pacjent.urls')),
] 

pacjent.urls ressemble à ça:

url(r'^api/szczegoly/(?P<pk>\d+)/$', PatientDetailApi.as_view(), name="api_pacjent"),

Et PatientDetailApi est la suivante:

class PatientDetailApi(generics.RetrieveUpdateAPIView):
    model = Patient
    serializer_class = PatientDetailsSerializer
    queryset = Patient.objects.all()

    authentication_classes = (SessionAuthentication, BasicAuthentication)
    permission_classes = (IsAuthenticated,) 
20
user1544500

Les fonctions de vue sont appelées avec la requête et les arguments de l'URL. Alors passez-les:

response = view(request, pk=1)
28
RemcoGerlich

J'ai rencontré une erreur similaire lorsque j'ai fait une erreur en utilisant la méthode get_object dans perform_create. Lisez pourquoi cela ne va pas documentation

perform_create(self,instance):
      instance = self.get_object()
0
7guyo