Простой пример Django и CSS
Я новичок в Django и пытаюсь настроить действительно простое приложение Django.
Теперь я дошел до главы 5 в онлайн-книге Django: http://www.djangobook.com/en/2.0/chapter05/
Все, что я хочу сделать сейчас, прежде чем начинать пробовать базы данных, - это добавить в приложение простые CS и J как есть.
Итак, вопрос в том, как мне это сделать? У меня есть только одно приложение, и я хочу только main.css в папке css и main.js в папке js.
Я проверил страницу https://docs.djangoproject.com/en/1.3/howto/static-files/#staticfiles-in-templates, но после чтения и чтения, похоже, было не так много работы с примерами.
Как импортировать таблицы стилей /css (есть ли такой помощник, как CakePHP?), Куда мне поместить файлы CSS и JS, и нужно ли мне настраивать статические штуки?
ОБНОВЛЕНИЕ: ссылка: Рендеринг CSS в Django не сильно помогает. Главным образом в том, что это не сработало для меня, но также мне особенно не нравится часть "если отладка". Что происходит, когда я перехожу на прод? Почему в любом случае моя папка мультимедиа определяется по-разному для prod и local dev? Разве это не должно быть относительно или даже в одном месте?
Ответы
Ответ 1
Если вы следуете рекомендациям django, вы можете значительно упростить свою жизнь.
В вашем примере кода внутри каталога приложения создайте папку с именем static. Внутри этой папки поместите свои файлы css.
Пример:
$ django-admin.py startproject myproject
$ cd myproject
myproject$ python manage.py startapp myapp
myproject$ mkdir myapp/static
myproject$ cd myapp/static
myproject/myapp/static$ nano style.css
В ваших шаблонах:
<link rel="stylesheet" href="{{ STATIC_URL }}style.css" />
Убедитесь, что вы добавили myapp
в список INSTALLED_APPS
в settings.py
. Теперь, когда вы используете встроенный сервер разработки, ваша таблица стилей будет отображаться правильно.
Django ищет каталог static
внутри установленных приложений по умолчанию, а с текущими версиями django по умолчанию включены статические файлы.
Пример Django имеет путь my_app/static/my_app/myimage.jpg
, который немного запутанно, если ваше приложение и проект имеют одинаковое имя.
Это рекомендуется, так как при запуске collectstatic
для сбора всех ваших статических файлов файлы с тем же именем будут перезаписаны. Если в другом приложении есть файл с именем myimage.jpg
, он будет перезаписан. Предоставление имени приложения внутри статического каталога предотвратит это, потому что точная структура каталогов будет реплицирована внутри вашего каталога STATIC_ROOT
.
Простой пример, иллюстрирующий точку. Если у вас есть проект django с двумя приложениями, например:
.
├── assets
├── manage.py
├── myapp
│ ├── __init__.py
│ ├── models.py
│ ├── static
│ │ └── myapp
│ │ └── test.txt
│ ├── tests.py
│ └── views.py
├── myproj
│ ├── __init__.py
│ ├── __init__.pyc
│ ├── settings.py
│ ├── settings.pyc
│ ├── urls.py
│ └── wsgi.py
└── otherapp
├── __init__.py
├── models.py
├── static
│ └── otherapp
│ └── test.txt
├── tests.py
└── views.py
assets
- ваш STATIC_ROOT
. Теперь, когда вы запустите collectstatic
:
.
├── assets
│ ├── myapp
│ │ └── test.txt
│ └── otherapp
│ └── test.txt
├── manage.py
├── myapp
│ ├── __init__.py
│ ├── __init__.pyc
│ ├── models.py
│ ├── static
│ │ └── myapp
│ │ └── test.txt
│ ├── tests.py
│ └── views.py
├── myproj
│ ├── __init__.py
│ ├── __init__.pyc
│ ├── settings.py
│ ├── settings.pyc
│ ├── urls.py
│ └── wsgi.py
└── otherapp
├── __init__.py
├── __init__.pyc
├── models.py
├── static
│ └── otherapp
│ └── test.txt
├── tests.py
└── views.py
Вы видите, что это также создает каталоги. В ваших шаблонах вы теперь будете ссылаться на каждый файл с его "пространством имен" приложения: {{ STATIC_URL }}/myapp/test.txt
Ответ 2
Для примеров, на которые вы указали, ваши статические файлы должны находиться в местоположении, доступном для встроенного приложения staticfiles
для Django.
Есть несколько шагов, чтобы это произошло:
Во-первых, в вашем каталоге проекта (т.е. рядом с вашим файлом manage.py
) вам нужно создать каталог для хранения ваших статических файлов. Назовите его "static_files".
Затем вам нужно будет позволить Django знать, что искать в этом каталоге, указав его в списке STATICFILES_DIRS
в вашем файле settings.py
.
Что-то вроде этого:
STATICFILES_DIRS = [
'/full/path/to/your/project/static_files/',
]
Внутри этого каталога static_files
вы можете создать любую структуру, которая вам нужна, так что ваши каталоги css
и js
могут пойти.
После этого вы сможете использовать тег {{ STATIC_URL }}
в своих шаблонах, чтобы получить доступ к базовому URL ваших статических файлов.
Итак, скажем, например, вы создаете project/static_files/css/base.css
, вы бы использовали его в своем шаблоне так:
<link rel="stylesheet" type="text/css" href="{{ STATIC_URL }}/css/base.css" />
Надеюсь, что это поможет!
Edit
С настройками по умолчанию для STATICFILES_FINDERS
, Django должен автоматически обслуживать любые файлы из каталогов, перечисленных в вашем STATICFILES_DIRS - см. документы для подробности.
Если это не сработает, проверьте некоторые вещи:
- Вы отредактировали настройку
STATICFILES_FINDERS
для чего-то другого, кроме значения по умолчанию?
- Является ли
django.contrib.staticfiles
в вашем списке INSTALLED_APPS
в settings.py
?
- Используете ли вы встроенный сервер Django (
python manage.py runserver
)?
- У вас есть
DEBUG = True
в вашем settings.py
? Если нет, вам нужно либо установить его на True
, либо использовать параметр insecure
(python manage.py runserver --insecure
). При переходе на производство ознакомьтесь с командой collectstatic
.
Ответ 3
Рекомендуемый подход снова изменился (по крайней мере, с Django 1.5, я думаю).
В верхней части вашего шаблона поместите:
{% load staticfiles %}
Затем, используя ту же структуру каталогов (myapp/static/myapp/style.css
):
<link rel="stylesheet" href="{% static 'myapp/style.css' %}" />
Источник
Ответ 4
Обработка статических файлов значительно изменилась (к лучшему) в Django 1.3. В частности, это гибкая разница между статическими файлами (думаю, код нужен CSS/JS/images) и медиафайлы (думаю, изображения, загруженные пользователями при использовании вашего приложения). Приложение staticfiles
обрабатывает то, о чем вы просите.
Поместите django.contrib.staticfiles
в свои settings.py INSTALLED_APPS. Затем создайте каталог static
внутри вашего каталога приложений - так project/app/static/
. Внутри этого статического каталога организуйте свои файлы поддержки по своему усмотрению (css/, js/, images/, icons/и т.д.). staticfiles
по умолчанию будет выглядеть в каталоге static/для каждого приложения, указанного в INSTALLED_APPS. Не только ваши собственные, но все приложения Django и сторонние приложения. (sidenote: Admin в Django 1.4 переходит к этой парадигме, а в 1.3 он все еще использует ADMIN_MEDIA_PREFIX).
Приложение staticfiles
знает обо всех этих статических/каталогах во всех приложениях, но ему нужно собрать все это содержимое для его обслуживания. В разработке при использовании manage.py runserver
он обрабатывается для вас. Django запустит ваш сайт и автоматически доставляет весь статический контент из всех статических источников. (Источники, как упоминалось в другом ответе, устанавливаются в настройке STATICFILES_FINDERS.) Если вы не используете runerver, используйте manage.py collectstatic
, чтобы собрать все статические файлы в папку, определенную в STATIC_ROOT
. Храните этот каталог пустым. Это пункт назначения коллекции. Конечно, ваш веб-сервер должен быть настроен для обслуживания этого каталога.
Теперь есть еще один фрагмент - вид. Здесь вступает в игру STATIC_URL
. При обращении к статическим файлам в ваших шаблонах самым простым способом является использование {{ STATIC_URL }}
. По умолчанию Django делает эту переменную доступной для любого представления, используя RequestContext. Сделайте что-то вроде этого - <link rel="stylesheet" href="{{ STATIC_URL }}/css/main.css" />
.
Для получения дополнительной информации и других способов обращения к STATIC_URL в ваших шаблонах ознакомьтесь с этим ответом по аналогичному вопросу.
Ответ 5
наконец, я получил после многих дней, вот как это должно быть сделано
1> вам нужен статический файл в вашем приложении вместе с вашим проектом
2> здесь setting.py
if DEBUG:
STATIC_ROOT = "/PycharmProjects/don/admin/shopping/static/css"
STATICFILES_DIRS =(
#os.path.join(os.path.dirname(BASE_DIR),"static","static"),
os.path.join(BASE_DIR, "static"),
)
3> views.py
from django.views.generic import TemplateView
class HomeView(TemplateView):
template_name = 'index.html'
4> файл шаблона
{% load staticfiles %}
<link rel="stylesheet" href="{% static 'css/style.css' %}">
5> urls.py
from shopping.views import HomeView
from django.conf import settings
from django.conf.urls.static import static
urlpatterns = [
url(r'^admin/', admin.site.urls),
url(r'^$', HomeView.as_view())
]
if settings.DEBUG:
urlpatterns+=static(settings.STATIC_URL,document_root=settings.STATIC_ROOT)
6> python manage.py collectstatic
have fun :)
Ответ 6
Кто-нибудь знает, как это сделать во Flask?