Reverse и HttpResponseRedirect не работают с DefaultRouter

Мне нужно отправить ответ с деталями продукта, поэтому я использую HttpResponseRedirect и реверс. Он требует имя_приложения:имя, поэтому я попробовал что-то вроде ниже, но получаю ошибку:

django.urls.exceptions.NoReverseMatch: Reverse for 'product' not found. 'ProductViewSet' is not a valid view function or pattern name.

Вот мое мнение:

@api_view(['POST'])
@permission_classes([IsAuthenticated])
def bump(request, pk):
    product = get_object_or_404(Product, id=pk)
    product.bumps.add(request.user)
    return HttpResponseRedirect(reverse('products:product', args=[pk]))

Вот мои урлы:

app_name = 'products'
router = DefaultRouter()
router.register(r'', ProductViewSet)

urlpatterns = [
    path('', include(router.urls), name='product'),
]

Что не так в этом коде? Я использую правильные app_name и name.

Что не так в этом коде? Я использую правильные app_name и name.

Используемый вами путь не связан с представлением: это путь, который содержит множество подпутей, созданных с помощью DefaultRouter.

Вы используете маршрутизатор, это означает, что он будет создавать различные пути, каждый из которых будет иметь определенное имя. Они документированы в документации для DefaultRouter [drf-doc].

Вы можете посетить это с:

from django.shortcuts import redirect

@api_view(['POST'])
@permission_classes([IsAuthenticated])
def bump(request, pk):
    product = get_object_or_404(Product, pk=pk)
    product.bumps.add(request.user)
    return redirect('products:product-detail', pk)

Вы используете ProductViewSet в урлах, но в представлениях у вас нет этого ViewSet.

Возможно, вам следует реализовать ProductViewSet в ваших представлениях или использовать ваше представление bump в урлах вместо ProductViewSet.

Вернуться на верх