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 в файлах курса был изменен по сравнению со значением по умолчанию, это может быть сделано для того, чтобы учесть другие изменения, которые являются частью курса.