Как развернуть URL в формате namespace:view:endpoint?

У меня есть проект Django со следующим urlpattern, определенным на уровне проекта:

urlpatterns = [
    path('', include(('ws_shopify.urls', 'ws_shopify'), namespace='shopify')),
]

В файле ws_shopify.urls определены следующие url-шаблоны:

urlpatterns = [
    path('api/shopify/', ShopifyWebhookAPIView.as_view(), name='webhook'),
]

Класс ShopifyWebhookAPIView определяет следующую конечную точку:

from rest_framework.views import APIView

class ShopifyWebhookAPIView(APIView):
    @action(detail=False, methods=['post'], url_path='(?P<webshop_name>.+)/order_created', name='order-created')
    def order_created(self, request: Request, webshop_name=None):
        return Response({'message': f'Order created for {webshop_name}'})

Мой вопрос таков:

Какое правильное имя этой конечной точки будет использоваться в тестовом примере, использующем reverse()?

Я пробую это сейчас:

class WebhookTestCase(TestCase):
    def test_that_url_resolves(self):
        url = reverse('shopify:webhook:order-created', kwargs={'webshop_name': 'my-shop'})
        self.assertEqual(url, '/api/shopify/my-shop/order_created')

Но это не удается со следующим сообщением об ошибке:

django.urls.exceptions.NoReverseMatch: 'webhook' is not a registered namespace inside 'shopify'

Не уверен, что это уместно или нет, вот как выглядит ws_shopify.apps:

from django.apps import AppConfig

class ShopifyConfig(AppConfig):
    name = 'ws_shopify'

Я заставил его работать со следующими изменениями:

В ws_shopify.urls:

from django.urls import path, include
from rest_framework.routers import DefaultRouter

from ws_shopify.views import ShopifyWebhookViewSet

router = DefaultRouter()
router.register(r'', ShopifyWebhookViewSet, basename='webhook')

urlpatterns = [
    path('api/shopify/', include(router.urls)),
]

В ws_shopify.views:

from rest_framework.viewsets import ViewSet

class ShopifyWebhookViewSet(ViewSet):
    @action(detail=False, methods=['post'], url_path='(?P<webshop_name>.+)/order_created', name='order-created')
    def order_created(self, request: Request, webshop_name=None):
        return Response({'message': f'Order created for {webshop_name}'})

В ws_shopify.tests_views:

class WebhookTestCase(TestCase):
    def test_that_url_resolves(self):
        url = reverse('shopify:webhook-order-created', kwargs={'webshop_name': 'my-shop'})
        self.assertEqual(url, '/api/shopify/my-shop/order_created/')
Вернуться на верх