Django 4.0.5: Как правильно связывать статические файлы с шаблонами

Я прохожу курс CS50W и заметил странное поведение при прохождении лекции по Django. В общем, я получал ошибку 404 при загрузке файла styles.css в одном из приложений.

После проверки исходного кода лекции, основное отличие заключалось в том, что в лекции для определения STATIC_URL использовалось следующее:

# Static files (CSS, JavaScript, Images)
# https://docs.djangoproject.com/en/4.0/howto/static-files/

STATIC_URL = '/static/'

И заметил, что даже документация Django определяет STATIC_URL как STATIC_URL = 'static/', и каким-то образом добавление слеша в начале устраняет проблемы с 404. Может кто-нибудь объяснить мне, почему это так?

Для справки, вот структура моего проекта (проблема находится в приложении под названием newyear):

.
├── db.sqlite3
├── manage.py
├── myapp
│   ├── __init__.py
│   ├── __pycache__
│   │   ├── __init__.cpython-38.pyc
│   │   ├── admin.cpython-38.pyc
│   │   ├── apps.cpython-38.pyc
│   │   ├── models.cpython-38.pyc
│   │   ├── urls.cpython-38.pyc
│   │   └── views.cpython-38.pyc
│   ├── admin.py
│   ├── apps.py
│   ├── migrations
│   │   ├── __init__.py
│   │   └── __pycache__
│   │       └── __init__.cpython-38.pyc
│   ├── models.py
│   ├── templates
│   │   └── myapp
│   │       ├── greet.html
│   │       └── index.html
│   ├── tests.py
│   ├── urls.py
│   └── views.py
├── newyear
│   ├── __init__.py
│   ├── __pycache__
│   │   ├── __init__.cpython-38.pyc
│   │   ├── admin.cpython-38.pyc
│   │   ├── apps.cpython-38.pyc
│   │   ├── models.cpython-38.pyc
│   │   ├── urls.cpython-38.pyc
│   │   └── views.cpython-38.pyc
│   ├── admin.py
│   ├── apps.py
│   ├── migrations
│   │   ├── __init__.py
│   │   └── __pycache__
│   │       └── __init__.cpython-38.pyc
│   ├── models.py
│   ├── static
│   │   └── newyear
│   │       └── styles.css
│   ├── templates
│   │   └── newyear
│   │       └── index.html
│   ├── tests.py
│   ├── urls.py
│   └── views.py
└── prueba
    ├── __init__.py
    ├── __pycache__
    │   ├── __init__.cpython-38.pyc
    │   ├── settings.cpython-38.pyc
    │   ├── urls.cpython-38.pyc
    │   └── wsgi.cpython-38.pyc
    ├── asgi.py
    ├── settings.py
    ├── urls.py
    └── wsgi.py

Шаблон, связывающий стили:

<!DOCTYPE html>
<html lang="en">
    <head>
        {% load static %}
        <link rel="stylesheet" href="{% static 'newyear/styles.css' %}">
        <meta charset="UTF-8">
        <meta http-equiv="X-UA-Compatible" content="IE=edge">
        <meta name="viewport" content="width=device-width, initial-scale=1.0">
        <title>Is it new year?</title>
    </head>
    <body>
        {% if newyear %}
            <h1>Yes</h1>
        {% else %}
            <h1>No</h1>
        {% endif %}
    </body>
</html>

Примечание: Я знаю, что это может быть основной вопрос, и я могу просто использовать то, что работает, а именно добавление косой черты при определении STATIC_URL, однако, я бы очень хотел понять, является ли это действительно правильным способом сделать это, и если да, то почему файл settings.py по умолчанию устанавливается таким образом, что он требует добавления косой черты.

До версии Django 4.0 по умолчанию был '/static/', как описано в документации.

Недавно было несколько записей в журнале изменений, касающихся этого (относительно).

3.1 Параметры STATIC_URL и MEDIA_URL, установленные на относительные пути теперь имеют префикс из значения SCRIPT_NAME, предоставленного сервером (или /, если не задано). Это изменение не должно повлиять на настройки, заданные для действительных URL или абсолютным путям.

4.0 Чтобы разрешить обслуживание сайта Django на подпути без изменения значение STATIC_URL, ведущий слэш удаляется из этого (теперь это 'static/') в шаблоне startproject по умолчанию.

Когда я менял значение параметра в 4.0, чтобы убрать или добавить прямую косую черту, это не имело значения, но если файл settings.py в файлах курса был изменен по сравнению со значением по умолчанию, это может быть сделано для того, чтобы учесть другие изменения, которые являются частью курса.

Вернуться на верх