Django статические файлы не загружаются - PullRequest
3 голосов
/ 05 марта 2010

Я пытаюсь добавить файлы .css и .js в мои файлы шаблонов HTML, созданные для Django. Я следовал официальному документу , поэтому мои настройки:

urls.py

urlpatterns = patterns('',
            (r'^site_media/(?P<path>.*)$', 'django.views.static.serve',
                {'document_root': settings.STATIC_DOC_ROOT}),

settings.py

STATIC_DOC_ROOT = ''/myfirstapp/templates/seminar_form/' 

Но все же я не смог сделать это правильно, эти .css .js и файлы изображений по-прежнему не загружаются в мой HTML, но эти файлы могут получить доступ (отлично просматривается) после нажатия URL в браузере как это:

http://127.0.0.1:8000/site_media/images/calendar.png 

Код шаблона

<img src="{{ site_media }}images/calendar.png"> 

Ответы [ 3 ]

9 голосов
/ 05 марта 2010

Если вы можете просматривать файлы, нажимая URL-адрес непосредственно в браузере, то я думаю, что вы неправильно установили MEDIA_URL настройки или что-то не так в коде вашего шаблона. На какой URL ссылается ваш HTML для ваших CSS / JS / Images?

Убедитесь, что вы проходите через MEDIA_URL, чтобы он был доступен в контексте вашего шаблона, что вы делаете, заключая запрос, передаваемый вашим функциям представления, в RequestContext, например:

def some_view(request):
    # ...
    return render_to_response('my_template.html',
                              my_data_dictionary,
                              context_instance=RequestContext(request))

Если вы правильно установили MEDIA_URL и правильно используете мультимедиа (о ​​чем говорит ваш вопрос), вы сможете получить доступ к мультимедиа, используя такие вещи, как:

<img src="{{ MEDIA_URL }}relative/path/to/media.jpg" alt="Foobar" />

После редактирования отобразить код шаблона:

Судя по вашему шаблонному коду, вы пытаетесь ссылаться на файлы с корнем в переменной шаблона с именем site_media, которая, вероятно, не существует.

Вам нужно поместить что-то подобное в ваш settings.py:

MEDIA_URL = u'/site_media/'

Затем измените код вашего шаблона на что-то вроде этого:

<img src="{{ MEDIA_URL }}images/calendar.png">

и убедитесь, что вы передаете MEDIA_URL в шаблон из функции просмотра.

После комментария с просьбой дать разъяснения по поводу RequestContext:

В онлайновой книге по Django есть несколько полезных (хотя в настоящее время не хватает некоторых частей) документации о RequestContext. Лично я использую декоратор render_to от django-раздражает, чтобы не думать об этом. Вместо моего более раннего примера кода представления вы можете просто сделать это:

from annoying import render_to

@render_to('my_template.html')
def some_view(request):
    ...
    return my_data_dictionary

По сути, вы просто декорируете свою функцию представления, передавая шаблон, который вы хотите визуализировать, а затем просто возвращаете dict, содержащий дополнительные переменные контекста, которые вы хотите установить (т.е. переменные контекста в дополнение к тем, которые установлены для вас RequestContext, например MEDIA_URL).

Этот подход, очевидно, не работает, если ваше представление может использовать разные шаблоны в зависимости от некоторых условий, но есть простые способы:

def some_view(request, some_var):
  ...
  if some_var:
    return render_to_response('my_template.html',
                              my_data_dictionary,
                              context_instance=RequestContext(request))
  else:
    return render_to_response('my_other_template.html',
                              my_data_dictionary,
                              context_instance=RequestContext(request))

Можно переписать как:

def some_view(request, some_var):
  ...
  if some_var:
    return _some_private_view(request, my_data_dictionary)
  else:
    return _some_other_private_view(request, my_data_dictionary)

@render_to('my_template.html')
def _some_private_view(request, my_data_dictionary):
  return my_data_dictionary

@render_to('my_other_template.html')
def _some_private_view(request, my_data_dictionary):
  return my_data_dictionary

Что кажется мне более понятным, по крайней мере.

2 голосов
/ 13 ноября 2012

Что сработало для меня, так это добавление статического пути к файлам в STATICFILES_DIRS. В среде разработки это кажется лучшим решением.

 STATICFILES_DIRS = (
   '/path/to/your/static/files/',
 )

например:

STATICFILES_DIRS = (
   '/home/chathuranga/App/templates/',
)

Надеюсь, это поможет.

2 голосов
/ 31 марта 2011

простое объяснение загрузки изображения, которое я нашел:

в settings.py:

from os import path

#media files are in <project folder>/static-media
MEDIA_ROOT = path.join(path.abspath(path.dirname(__file__)), 'static-media')

в urls.py:

from django.conf import settings

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

использование в html:

<!--image location -  <project folder>/static-media/images/calendar.png-->
<img src="/media/images/calendar.png">
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...