Interview question
How do you organize URLs using include() and app namespacing in Django? Django में include() और app namespacing से URLs को कैसे organize करें?
Answer
include() lets you delegate a URL prefix to another app's urls.py, keeping the project's main URL configuration modular and each app's URLs self-contained. Namespacing avoids name collisions between apps using the same URL name.
# project/urls.py - the root URL configuration
from django.contrib import admin
from django.urls import path, include
urlpatterns = [
path('admin/', admin.site.urls),
path('books/', include('books.urls')), # delegates /books/* to the books app
path('accounts/', include('accounts.urls')), # delegates /accounts/* to accounts app
path('api/', include('api.urls')),
]
# books/urls.py - app-specific URLs
from django.urls import path
from . import views
app_name = 'books' # namespace for this app's URLs
urlpatterns = [
path('', views.book_list, name='list'), # full URL: /books/
path('<int:pk>/', views.book_detail, name='detail'), # /books/5/
]
# accounts/urls.py - could ALSO have a URL named 'detail' without conflict,
# because each is namespaced separately
app_name = 'accounts'
urlpatterns = [
path('<int:pk>/', views.profile_detail, name='detail'), # /accounts/5/
]
# Referencing namespaced URLs in templates - use 'app_name:url_name'
# {% url 'books:detail' pk=book.pk %}
# {% url 'accounts:detail' pk=user.pk %}
# Referencing namespaced URLs in Python code
from django.urls import reverse
url = reverse('books:detail', kwargs={'pk': 5}) # /books/5/
# Without namespacing, two apps both using name='detail' would clash -
# Django would resolve to whichever was registered LAST, silently breaking
# the other app's links
# Instance namespaces (for the same app included multiple times)
urlpatterns = [
path('author-books/', include('books.urls', namespace='author-books')),
path('reader-books/', include('books.urls', namespace='reader-books')),
]include() किसी दूसरे app के urls.py को URL prefix delegate करने देता है, project के main URL configuration को modular रखता है। Namespacing same URL name वाले apps के बीच collision से बचाता है।
# project/urls.py
from django.contrib import admin
from django.urls import path, include
urlpatterns = [
path('admin/', admin.site.urls),
path('books/', include('books.urls')),
path('accounts/', include('accounts.urls')),
path('api/', include('api.urls')),
]
# books/urls.py
from django.urls import path
from . import views
app_name = 'books'
urlpatterns = [
path('', views.book_list, name='list'),
path('<int:pk>/', views.book_detail, name='detail'),
]
# accounts/urls.py - अलग namespace में भी 'detail' नाम हो सकता है
app_name = 'accounts'
urlpatterns = [
path('<int:pk>/', views.profile_detail, name='detail'),
]
# Templates में namespaced URLs
# {% url 'books:detail' pk=book.pk %}
# {% url 'accounts:detail' pk=user.pk %}
# Python code में
from django.urls import reverse
url = reverse('books:detail', kwargs={'pk': 5})
# Namespacing के बिना दो apps में name='detail' clash कर सकता हैWas this answer clear?