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
.