Как мне использовать CSS для Django в разработке?

#python #django

#python #django

Вопрос:

Я просмотрел всю документацию, и для меня это просто не имеет смысла. Я запустил collectstatic, я установил /static/ directories как в моем приложении, так и в каталогах моего проекта, я добавил STATIC_URL и STATIC_ROOT в свой settings.py file (но я понятия не имею, как узнать, правильно ли они установлены), а {{STATIC_URL }} по-прежнему ни во что не преобразуется. Все это кажется чертовски излишним просто для подключения html к css.

Я думаю, что я запутался в деталях; может ли кто-нибудь предоставить высокоуровневую разбивку этой идеи статических файлов? Боюсь, у меня могут быть смешанные инструкции как для производственных, так и для разработки.

ПОДРОБНЕЕ: Вот соответствующий фрагмент из моего settings.py файл:

 INSTALLED_APPS = (
    'django.contrib.auth',
    'django.contrib.contenttypes',
    'django.contrib.sessions',
    'django.contrib.sites',
    'django.contrib.messages',
    # Uncomment the next line to enable the admin:
    'django.contrib.admin',
    # Uncomment the next line to enable admin documentation:
    # 'django.contrib.admindocs',
    'django.contrib.staticfiles',
    'dashboard.base',
)

TEMPLATE_CONTEXT_PROCESSORS = (
    'django.core.context_processors.debug',
    'django.core.context_processors.i18n',
    'django.core.context_processors.media',
    'django.core.context_processors.static',
    'django.contrib.auth.context_processors.auth',
    'django.contrib.messages.context_processors.messages',
)

STATIC_ROOT = ''
STATIC_URL = '/static/'


STATICFILES_DIRS = (
    'C:/Users/Sean/Desktop/Work Items/dashboard/base/static/',
)
  

И это код, который я пытаюсь использовать в своем шаблоне:

 <link rel="stylesheet" href="{{ STATIC_URL }}css/960.css" />
  

ОК. Я внес изменения, которые все рекомендовали. Вот мой новый urls.py:

 from django.conf.urls.defaults import *
from base.views import show_project
from django.conf import settings
from django.contrib.staticfiles.urls import staticfiles_urlpatterns

# Uncomment the next two lines to enable the admin:
from django.contrib import admin
admin.autodiscover()

urlpatterns = patterns('',
# Example:
# (r'^dashboard/', include('dashboard.foo.urls')),

# Uncomment the admin/doc line below to enable admin documentation:
# (r'^admin/doc/', include('django.contrib.admindocs.urls')),

# Uncomment the next line to enable the admin:
(r'^admin/', include(admin.site.urls)),
('^show_project/$', show_project),
)

if settings.DEBUG:
    urlpatterns  = patterns('',
        url(r'^media/(?P<path>.*)$', 'django.views.static.serve',{'document_root': settings.MEDIA_ROOT, 'show_indexes': True }),
        url(r'^static/(?P<path>.*)$', 'django.views.static.serve', {'document_root': settings.STATIC_ROOT, 'show_indexes': True }))

urlpatterns  = staticfiles_urlpatterns()
  

Я что-то упускаю? Обычно мои проблемы оказываются чем-то действительно базовым, что профессионалы CS считают само собой разумеющимся, но я скучаю.

Ответ №1:

Вот как моя настройка. Похоже, вам может не хватать статического контекстного процессора?

STATIC_ROOT и STATIC_URL

В settings.py используется в разработке:

 STATIC_ROOT = ''
STATIC_URL = '/static/'
  

И settings.py используется на моем производственном сервере:

 STATIC_URL = '//static.MYDOMAIN.com/'
STATIC_ROOT = '/home/USER/public_html/static.MYDOMAIN.com/'
  

Итак, все статические файлы находятся в static/ . На рабочем сервере все эти файлы static/ собираются /home/USER/public_html/static.MYDOMAIN.com/ там, где они обслуживаются другим веб-сервером (в моем случае nginx), а не Django. Другими словами, мое приложение django (работающее на Apache) никогда даже не получает запросы на статические ресурсы в рабочей среде.

КОНТЕКСТНЫЙ ПРОЦЕССОР

Для того, чтобы шаблоны имели STATIC_URL доступную для них переменную, вам необходимо использовать django.core.context_processors.static контекстный процессор, также определенный в settings.py :

 TEMPLATE_CONTEXT_PROCESSORS = (
    # other context processors....
    'django.core.context_processors.static',
    # other context processors....
)
  

СТАТИЧЕСКИЕ РЕСУРСЫ СЕРВЕРА В РАЗРАБОТКЕ

Django не получает запросы на статические ресурсы в процессе разработки, однако в процессе разработки мы просто позволяем Django обслуживать наш статический контент. Мы используем staticfiles_urlpatterns in urls.py , чтобы указать Django обслуживать запросы static/* .

 from django.contrib.staticfiles.urls import staticfiles_urlpatterns
# .... your url patterns are here ...
urlpatterns  = staticfiles_urlpatterns()
  

Комментарии:

1. Спасибо — у меня есть процессор — вы можете увидеть его в моем файле выше. Ваши настройки мне помогли: я использовал абсолютные пути в настройках STATIC_ROOT и STATIC_URL. Я исправил это, но я думаю, что мне все еще нужны абсолютные пути в STATICFILES_DIRS, верно?

2. @StormShadow, вы могли бы сделать os.path.join(os.dirname(__file__),"static") , предполагая, что ваши статические файлы находятся в том же каталоге, settings.py что и .

3. Я думаю, что вы не упоминаете, обслуживаете ли вы свои файлы с помощью сервера разработки Django или другого сервера, такого как nginx или Apache. Если второе, то проблема может быть связана с конфигурацией вашего производственного сервера, а не с настройками конфигурации в вашем проекте.

Ответ №2:

Посмотрите на обслуживание статических файлов в разработке. Вам нужно определить STATIC_URL и STATICFILES_DIRS сообщить django.contrib.staticfiles , где искать файлы.

Комментарии:

1. Правильно. На самом деле, это то, от чего я сейчас ухожу. Но это не работает. Я использую косые черты и начинаю пути с C:/ . Это неправильно?

2. Кстати, для них обоих установлено одно и то же значение, поскольку я не знаю, что на самом деле устанавливает переменную {{ STATIC_URL }} . Похоже, ни один из них не работает.

3. Они не должны быть одинаковыми. STATICFILES_DIRS должен находиться там, где в данный момент находятся ваши файлы, STATIC_ROOT должен быть отдельной папкой, в которой вы хотите, чтобы ваши файлы заканчивались при их сборе, а STATIC_URL должен быть путем, который вы хотите использовать для доступа к своим файлам при использовании вашего сайта / приложения

Ответ №3:

Идея идеи статических файлов заключается в том, что вы можете распространять медиафайлы, связанные с разработкой (css / js и т. Д.), Для каждого приложения и разрешать приложению static files управлять всеми этими ресурсами и собирать их из разных мест.

Итак, вы указываете приложению static files, где искать статические файлы (с помощью настроек STATICFILES_DIRS), куда их копировать (STATIC_ROOT) и какой путь для доступа к ним (STATIC_URL). Когда вы запускаете collectstatic, он выполняет поиск по каталогам и копирует все найденные файлы в статический корень.

Преимущество этого заключается в том, что вы можете управлять своими статическими файлами на более высоком уровне:

 project/app1/static/css/ # These are css/js for a particular app
project/app2/static/css/
project/app3/static/css/
project/static/css # These might be general css/js for the whole project
static/ # This is where the collectstatic command will copy files to
  

и после того, как вы соберете их, у вас будет:

 project/app1/static/css/
project/app2/static/css/
project/app3/static/css/
project/static/css

static/app1/css/
static/app2/css/
static/app3/css/
static/css/
  

Когда вы размещаете свое приложение / сайт на рабочем сервере, вы позволяете веб-серверу (apache, nginx) обрабатывать файлы, указывая ему обслуживать медиафайлы в /static/ или /media/ напрямую, передавая все остальные запросы приложению. Однако при разработке проще позволить серверу разработки сделать это за вас.

Для этого вы должны явно указать серверу любой запрос на медиа в /static/ (ваш STATIC_URL). В вашем urls.py , поместите следующее (или аналогичное)

 from django.conf import settings
...
if settings.DEBUG:
    urlpatterns  = patterns('',
        url(r'^media/(?P<path>.*)$', 'django.views.static.serve',{'document_root': settings.MEDIA_ROOT, 'show_indexes': True }),
        url(r'^static/(?P<path>.*)$', 'django.views.static.serve', {'document_root': settings.STATIC_ROOT, 'show_indexes': True }))
  

Комментарии:

1. Да, это тоже не работает. Это дает мне «Ошибка имени в / show_project / name ‘settings’ не определена»

2. Спасибо! Но все равно ничего не получается. Я только что вставил другой код, который у меня есть прямо сейчас. Может быть, я что-то забыл в этом?

3. Как я уже говорил в другом комментарии, STATIC_URL и STATIC_ROOT не должны быть одинаковыми. STATIC_ROOT нуждается в ‘static /’ или подобном

Ответ №4:

У меня такая же проблема, и я ищу много ответов, но никто не дает мне правильного ответа. Проблема в том, что вы не используете RequestContext, я думаю. Вы должны сделать RequestContext в качестве параметра шаблона, например

 c = RequestContext(request, {
    'foo': 'bar',
})
  

На мой взгляд, это:

 return render_to_response('parts/test2.html', RequestContext(request, locals()))