Как избавиться от имени приложения в определенном 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 всегда будет выбирать первый.