DEV Community

Cover image for How Django Finds Static and Template Files: A Quick Guide
John Johnson Okah
John Johnson Okah

Posted on

How Django Finds Static and Template Files: A Quick Guide

Ever wondered how Django magically finds your CSS, JavaScript, images, and HTML files? It's not magic, but a well-defined system of settings and conventions! Understanding how Django locates static and template files is crucial for any Django developer (esp. those like me who can't get their favicon to display ;)
Here's a quick guide ↴


Static Seeker: How Django Hunts for CSS, JS, and Images

Static files, like stylesheets, scripts, and images, are the non-dynamic assets that make your web pages look and function beautifully. Django knows where to find them by checking a few key places:

  • App-Specific Static Folders: The primary place Django looks is within your apps themselves! Inside each app, Django expects a static directory. To avoid naming clashes, it's convention to create a subdirectory within static named after your app. So, for an app called my_app, the path would be my_app/static/my_app/.

  • Project-Level Static Folders (STATICFILES_DIRS): Sometimes you have static files that are not specific to any single app, like global stylesheets or shared images. The STATICFILES_DIRS setting in your settings.py is your go-to for this. It's a list of directories where Django will look for static files in addition to the app-specific folders.

  • Production Powerhouse (STATIC_ROOT): For production, you'll want to serve all your static files from one place for efficiency. That's where STATIC_ROOT comes in. This setting defines the absolute path to a directory where the collectstatic management command will gather all your static files into a single location. Your web server then serves these files from STATIC_ROOT.

Key Settings in settings.py for Static Files:

# settings.py

STATIC_URL = '/static/'  # URL to access static files (browser-facing)

STATICFILES_DIRS = [
    BASE_DIR / "static",  # Project-level static files in the root 'static' folder
]

STATIC_ROOT = BASE_DIR / "staticfiles" # Where 'collectstatic' puts all static files
Enter fullscreen mode Exit fullscreen mode

Example Directory Structure:

myproject/
├── myapp/
│   ├── static/
│   │   ├── myapp/
│   │   │   ├── css/
│   │   │   │   └── style.css
│   │   │   ├── images/
│   │   │   │   └── logo.png
├── static/             # Project-level static folder
│   └── global.css
├── settings.py
└── manage.py
Enter fullscreen mode Exit fullscreen mode

Accessing Static Files in Templates:

In your Django templates, you load the static template tag set and then use {% static 'path/to/your/static/file.ext' %} to generate the correct URL:

{% load static %}
<link rel="stylesheet" href="{% static 'myapp/css/style.css' %}">
<img src="{% static 'images/logo.png' %}" alt="My Logo">
Enter fullscreen mode Exit fullscreen mode

Template Tracker: Django's Path to HTML Files

Templates are your HTML files that Django dynamically fills with data. Django's template finding process is similarly structured:

  • App-Specific Template Folders: Just like static files, Django checks for a templates directory within each app. Following convention, create a subdirectory inside templates named after your app: my_app/templates/my_app/.

  • Project-Level Template Folders (TEMPLATES['DIRS']): For templates that are used across multiple apps or project-wide layouts, you can define global template directories in the TEMPLATES setting in settings.py under the DIRS key.

  • APP_DIRS: True Magic: Within the TEMPLATES setting, APP_DIRS: True is crucial! This setting tells Django to automatically look inside each app's templates/ directory.

Key Settings in settings.py for Templates:

# settings.py

TEMPLATES = [
    {
        'BACKEND': 'django.template.backends.django.DjangoTemplates',
        'DIRS': [BASE_DIR / "templates"],  # Project-level templates directory
        'APP_DIRS': True,  #  Look for templates in app 'templates' folders
        'OPTIONS': {
            'context_processors': [ # ... default context processors
            ],
        },
    },
]
Enter fullscreen mode Exit fullscreen mode

Example Directory Structure:

myproject/
├── myapp/
│   ├── templates/
│   │   ├── myapp/
│   │   │   ├── index.html
│   │   │   ├── detail.html
├── templates/          # Project-level templates folder
│   ├── base.html
│   ├── home.html
├── settings.py
└── manage.py
Enter fullscreen mode Exit fullscreen mode

Using Templates in Views:

In your Django views, you use render(request, 'template_name.html'). Django then searches for template_name.html based on the configured template directories.

from django.shortcuts import render

def my_view(request):
    return render(request, 'myapp/index.html') # Django finds 'myapp/templates/myapp/index.html'
Enter fullscreen mode Exit fullscreen mode

In Summary:

Django's organized approach to static and template files relies on clear settings and naming conventions. By understanding STATIC_URL, STATIC_ROOT, STATICFILES_DIRS, TEMPLATES['DIRS'], and APP_DIRS, you can effectively structure your Django projects and ensure Django can always find the files it needs.

Still scratching your head about a specific static or template issue? Check out Django's Official Documation on static files and template using the reference link below.


Ref:

Top comments (0)