Как мне предоставить CSS для Django в разработке? - PullRequest
5 голосов
/ 01 октября 2011

Я прошел всю документацию, и это просто не имеет смысла для меня. Я запустил Collectstatic, я установил / static / каталоги и в своем приложении, и в каталогах моего проекта, я добавил STATIC_URL и STATIC_ROOT в мой файл settings.py (но я не знаю, как узнать, правильно ли они установлены) и {{ 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" />

OK. Я внес изменения, рекомендованные всеми. Вот мой новый 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 считают само собой разумеющимся, но я скучаю.

Ответы [ 4 ]

4 голосов
/ 01 октября 2011

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

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) никогда даже не получает запросы на статические ресурсы в рабочей среде.

ПРОЦЕССОР КОНТЕКСТА

Для того, чтобы шаблоны имели *Для доступной им переменной 1022 * необходимо использовать контекстный процессор 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 в urls.py, чтобы сообщить Django об обработке запросов на static/*.

from django.contrib.staticfiles.urls import staticfiles_urlpatterns
# .... your url patterns are here ...
urlpatterns += staticfiles_urlpatterns()
2 голосов
/ 01 октября 2011

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

Таким образом, вы указываете приложению статических файлов, где искать статические файлы (с помощью настроек 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 }))
2 голосов
/ 01 октября 2011

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

0 голосов
/ 06 ноября 2011

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

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

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

return render_to_response('parts/test2.html', RequestContext(request, locals()))
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...