Как избавиться от имени приложения в определенном url?

У меня есть этот urls.py в моем приложении

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


app_name = 'products'
router = DefaultRouter()
router.register(r'products', views.ProductViewSet, basename='products')
router.register(r'categories', views.ProductCategoryViewSet, basename='categories')
router.register(r'brands', views.BrandViewSet, basename='brands')

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

А это urls.py моего проекта

from django.contrib.auth import views as auth_views
from django.contrib import admin
from django.urls import path, include

urlpatterns = [
    path('admin/', admin.site.urls),
    path('login/', auth_views.LoginView.as_view(template_name='users/login.html'),
         name='login'),
    path('logout/', auth_views.LoginView.as_view(template_name='users/logout.html'),
         name='logout'),
    path('__debug__/', include('debug_toolbar.urls')),
]

urlpatterns += [
    ...
    path('products/', include('products.urls', namespace='products')),
    ...
]

И наборы просмотров:

from rest_framework import viewsets, permissions
from .models import (
    Product,
    ProductCategory,
    Brand,
)
from .serializers import ProductSerializer, ProductCategorySerializer, BrandSerializer

#all other viewsets are the same
class ProductViewSet(viewsets.ModelViewSet):
    queryset = Product.objects.all()
    serializer_class = ProductSerializer
    permission_classes = [permissions.IsAuthenticatedOrReadOnly]

Роутер для моего приложения генерирует урлы почти как ожидалось, я могу перейти на 'site/products/categories' для категорий 'site/products/brands' для брендов НО для продуктов урл будет 'site/products/products'. Как заставить его не добавлять название приложения в этом случае? Я хочу, чтобы это было просто 'site/products'.

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


app_name = 'products'
router = DefaultRouter()
router.register(r'categories', views.ProductCategoryViewSet, basename='categories')
router.register(r'brands', views.BrandViewSet, basename='brands')
router.register(r'', views.ProductViewSet, basename='products')

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

Django пытается сопоставить url с одним url из списка маршрутизируемых url, поэтому если у вас есть два одинаковых url, но один из них быстрее в списке, Django всегда будет выбирать первый.

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