Skip to main content
Course/Module 2/Topic 4 of 5Beginner

URL Configuration

Master Django's URL routing system to map requests to views and handle dynamic URLs.

55 minBy Priygop TeamLast updated: Feb 2026

URL Routing in Django

Django uses URL patterns to route requests to the appropriate views. Understanding URL configuration is essential for building web applications.

URL Patterns

Example
# myproject/urls.py (Main URL configuration)
from django.contrib import admin
from django.urls import path, include
from django.conf import settings
from django.conf.urls.static import static

urlpatterns = [
    path('admin/', admin.site.urls),
    path('blog/', include('blog.urls')),  # Include app URLs
    path('', include('home.urls')),       # Home page URLs
]

# Serve static and media files in development
if settings.DEBUG:
    urlpatterns += static(settings.STATIC_URL, document_root=settings.STATIC_ROOT)
    urlpatterns += static(settings.MEDIA_URL, document_root=settings.MEDIA_ROOT)

# blog/urls.py (App-specific URLs)
from django.urls import path
from . import views

app_name = 'blog'  # URL namespace

urlpatterns = [
    path('', views.post_list, name='post_list'),
    path('post/<int:pk>/', views.post_detail, name='post_detail'),
    path('post/new/', views.post_new, name='post_new'),
    path('post/<int:pk>/edit/', views.post_edit, name='post_edit'),
]

# home/urls.py (Home page URLs)
from django.urls import path
from . import views

urlpatterns = [
    path('', views.home, name='home'),
    path('about/', views.about, name='about'),
    path('contact/', views.contact, name='contact'),
]

# URL Patterns with Parameters
# Integer parameters
path('post/<int:pk>/', views.post_detail, name='post_detail'),

# String parameters
path('category/<str:category>/', views.category_posts, name='category_posts'),

# Slug parameters
path('post/<slug:slug>/', views.post_detail, name='post_detail'),

# UUID parameters
path('user/<uuid:user_id>/', views.user_profile, name='user_profile'),

# Multiple parameters
path('post/<int:year>/<int:month>/<slug:slug>/', views.post_detail, name='post_detail'),

Practice Exercise: Dynamic URL Router

Example
# Dynamic URL Router for Django
from django.urls import path, re_path
from django.http import HttpResponse
from django.views.generic import TemplateView

class DynamicRouter:
    """A dynamic URL router that can generate URLs based on patterns"""
    
    def __init__(self):
        self.routes = {}
    
    def add_route(self, pattern, view_func, name=None):
        """Add a new route pattern"""
        self.routes[pattern] = {
            'view': view_func,
            'name': name or pattern
        }
    
    def get_urlpatterns(self):
        """Convert routes to Django URL patterns"""
        urlpatterns = []
        
        for pattern, route_info in self.routes.items():
            # Convert pattern to Django path
            if '<' in pattern and '>' in pattern:
                # Dynamic parameter pattern
                django_pattern = self._convert_pattern(pattern)
                urlpatterns.append(
                    path(django_pattern, route_info['view'], name=route_info['name'])
                )
            else:
                # Static pattern
                urlpatterns.append(
                    path(pattern, route_info['view'], name=route_info['name'])
                )
        
        return urlpatterns
    
    def _convert_pattern(self, pattern):
        """Convert custom pattern to Django URL pattern"""
        # Example: /user/{id}/profile -> /user/<int:id>/profile
        import re
        
        # Replace {param} with <type:param>
        pattern = re.sub(r'\{([^}]+)\}', r'<str:\1>', pattern)
        
        # Add type hints for common patterns
        pattern = re.sub(r'<str:id>', '<int:id>', pattern)
        pattern = re.sub(r'<str:pk>', '<int:pk>', pattern)
        pattern = re.sub(r'<str:slug>', '<slug:slug>', pattern)
        
        return pattern

# Example usage
def user_profile(request, user_id):
    return HttpResponse(f"User Profile: {user_id}")

def post_detail(request, post_id):
    return HttpResponse(f"Post Detail: {post_id}")

def category_posts(request, category):
    return HttpResponse(f"Category: {category}")

# Create router and add routes
router = DynamicRouter()
router.add_route('user/{id}/profile', user_profile, 'user_profile')
router.add_route('post/{id}', post_detail, 'post_detail')
router.add_route('category/{category}', category_posts, 'category_posts')

# Generate URL patterns
urlpatterns = router.get_urlpatterns()

# This would be used in your urls.py like:
# from .router import urlpatterns
# urlpatterns += urlpatterns

Additional Resources

Recommended Reading

  • Django Official Documentation
  • Django for Beginners by William S. Vincent
  • Two Scoops of Django by Daniel Greenfeld

Online Resources

  • Django Tutorial (djangoproject.com)
  • Django Girls Tutorial
  • Real Python Django Tutorials
Chat on WhatsApp
Priygop - Leading Professional Development Platform | Expert Courses & Interview Prep