Subjects

All subjects Django Java Python React Spring Boot JavaScript PHP
Sign Up Free
Question 9 of 9 · Django Views & URL Routing
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?