Python django.url.exceptions.NoReverseMatch:与#x27相反;用户详细信息';没有找到任何参数

Python django.url.exceptions.NoReverseMatch:与#x27相反;用户详细信息';没有找到任何参数,python,django,unit-testing,Python,Django,Unit Testing,我有一个相当简单的检索测试: def test_user_retrieve(self): factory = APIRequestFactory() User.objects.create_superuser(username='test', password='Welcome2', email='test@test.com') user = User.objects.get(username='test') view = UserViewSet.as_view(

我有一个相当简单的检索测试:

def test_user_retrieve(self):
    factory = APIRequestFactory()
    User.objects.create_superuser(username='test', password='Welcome2', email='test@test.com')
    user = User.objects.get(username='test')
    view = UserViewSet.as_view({'get': 'retrieve'})
    url = reverse('core:user-detail')
    request = factory.get(url)
    force_authenticate(request, user=user)
    response = view(request, pk=1)
    self.assertEqual(response.status_code, status.HTTP_200_OK)
它提供了以下回溯:

Traceback (most recent call last):
  File "D:\Projects\enterpass\api\core\tests.py", line 54, in test_user_retrieve
    url = reverse('core:user-detail')
  File "D:\Python36\lib\site-packages\django\urls\base.py", line 88, in reverse
    return iri_to_uri(resolver._reverse_with_prefix(view, prefix, *args, **kwargs))
  File "D:\Python36\lib\site-packages\django\urls\resolvers.py", line 632, in _reverse_with_prefix
    raise NoReverseMatch(msg)
django.urls.exceptions.NoReverseMatch: Reverse for 'user-detail' with no arguments not found. 2 pattern(s) tried: ['api/v1/core/users/(?P<pk>[^/.]+)\\.(?P<format>[a-z0-9]+)/?$', 'api/v1/core/users/(?P<pk>[^/.]+)/$']
正在通过路由器注册视图,如下所示:

app_name = 'core'
router.register(r'users', views.UserViewSet, base_name='user')
以下是视图中与此相关的部分:

class UserViewSet(viewsets.ModelViewSet):
    queryset = User.objects.all()
    serializer_class = UserSerializer
    permission_classes_by_action = {'list': [CanListUser],
                                    'create': [CanCreateUser],
                                    'retrieve': [CanRetrieveUser],
                                    'update': [CanUpdateUser],
                                    'destroy': [CanDestroyUser]}

    def retrieve(self, request, pk=None, **kwargs):
        try:
            instance = self.get_object()
            self.check_object_permissions(self.request, instance)
            serializer = UserSerializer(instance, context={'request': request})
            return Response(serializer.data, status=status.HTTP_200_OK)
        except User.DoesNotExist:
            return Response(status=status.HTTP_204_NO_CONTENT)
找到了解决方案,但我希望有人能根据此工作视图为我解释:

def test_user_retrieve(self):
    factory = APIRequestFactory()
    User.objects.create_superuser(username='test', password='Welcome2', email='test@test.com')
    user = User.objects.get(username='test')
    view = UserViewSet.as_view({'get': 'retrieve'})
    url = reverse('core:user-detail', args=(User.pk,))
    request = factory.get(url)
    force_authenticate(request, user=user)
    response = view(request, pk=1)
    self.assertEqual(response.status_code, status.HTTP_200_OK)
出于某种原因,我必须在URL中指定位置参数,然后在响应中我需要指定id。解决方案是从这里提取的:


我想您忘记了用
反向传递所需的参数。如下图所示,使用反向添加用户的pk

userPK = 123  # User ID
url = reverse('core:user-detail', args=[userPK])

我想您忘记了使用
反向传递所需参数。如下图所示,使用反向添加用户的pk

userPK = 123  # User ID
url = reverse('core:user-detail', args=[userPK])