Django REST Framework reverse() не находит соответствия для "{basename}-detail" маршрутизатора
Этот вопрос чрезвычайно похож на: Как исправить это исключение NoReverseMatch в маршрутизаторах Django rest frameworks? но это не было отвечено/решено и после долгих поисков здесь я ищу помощи.
Я пытаюсь создать API с помощью разработки на основе тестов. В соответствии с обычной практикой я начинаю свои тесты с сохранения постоянных переменных для URLS с помощью django.urls.reverse()
Проблема в том, что reverse('{app}:{basename}-list')
работает нормально, но reverse('{app}:{basename}-detail')
выбрасывает исключение:
django.urls.exceptions.NoReverseMatch: Reverse for 'designer-detail' with no arguments not found. 2 pattern(s) tried: ['api/design/designer/(?P<pk>[^/.]+)\\.(?P<format>[a-z0-9]+)/?$', 'api/design/designer/(?P<pk>[^/.]+)/$']
Мой test.py: (обратите внимание, что list url запускается первым и не выбрасывает исключений)
from rest_framework.test import APITestCase, APIClient
from django.contrib.auth import get_user_model
from rest_framework_simplejwt.tokens import RefreshToken
from django.urls import reverse
from rest_framework import status
from designs.models import Designer
from designs.serializers import DesignerSerializer
DESIGNER_LIST_URL = reverse('designs:designer-list')
DESIGNER_DETAIL_URL = reverse('designs:designer-detail')
My app/urls.py:
from rest_framework.routers import DefaultRouter
from designs.views import DesignerViewset
app_name = 'designs'
router = DefaultRouter()
router.register(r'designer', DesignerViewset, 'designer')
urlpatterns = router.urls
Мой проект/urls.py:
from django.contrib import admin
from django.urls import path, include
urlpatterns = [
path('admin/', admin.site.urls),
path('api/user/', include('user.urls')),
path('api/design/', include('designs.urls'))
]
Мой serializers.py:
from rest_framework import serializers
from designs.models import Designer
class DesignerSerializer(serializers.ModelSerializer):
"""
Model serializer for Designer.
"""
class Meta:
model = Designer
fields = "__all__"
И мой views.py:
from rest_framework.viewsets import ModelViewSet
from designs.models import Designer
from designs.serializers import DesignerSerializer
class DesignerViewset(ModelViewSet):
"""
ModelViewSet for the Designer model.
"""
queryset = Designer.objects.all()
serializer_class = DesignerSerializer
Я пробовал изменять basename, router, app_name, urlpatterns, но ничего не помогает. Я просмотрел официальную документацию по ванильному django и DRF. Больше всего смущает почему работает как ожидалось, но "designs:designer-list"
не работает? Предполагается, что DefaultRouter должен позаботиться об этом. Я вручную проверил это последнее сравнение в оболочке Django."designs:designer-detail"
Что я упускаю?
Причина, по которой возникает ошибка, заключается в том, что URL имеет параметр pk
, и вам необходимо указать его значение, чтобы определить путь URL.
Вы можете передать значение именованных параметров с параметром kwarg=…
, так:
reverse('designs:designer-detail', kwargs={'pk': 42})
где 42
- первичный ключ элемента, для которого вы хотите получить подробную информацию.