2010-10-06 1 views
0

У меня есть сервер разработки, работающий (и обслуживающий контент) с использованием встроенного сервера django. Все мои шаблоны, которые визуализируются из общих представлений, правильно указывают на статические медиафайлы (css/java/imgs), но те, которые отображаются через пользовательские представления, похоже, не добавляют папку/media/к URL-адресам. (По крайней мере, это, кажется, проблема)Сервер разработки Django: шаблоны визуализировать из пользовательских представлений, не получая статические носители

В моих настройках у меня есть:

DJANGO_PATH = os.path.realpath(os.path.dirname(__file__)) 
DB_PATH = os.path.join((os.path.split(DJANGO_PATH))[0] , 'db/dev.db') 
TEMPLATE_PATH = os.path.join(DJANGO_PATH , 'templates') 
DEBUG = True 
TEMPLATE_DEBUG = DEBUG 

MEDIA_PATH = os.path.join((os.path.split(DJANGO_PATH))[0] , 'media') 
ADMIN_MEDIA_PREFIX = '/media/admin/' 
MEDIA_URL = '/media/' 
MEDIA_ROOT = MEDIA_PATH 

и В моих URLs У меня есть запись

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

Кто-нибудь получил какие-либо идеи?

EDIT:
Ой, забыл упомянуть. Все мои шаблоны наследуют от базового шаблона, который имеет все медиа-файлы, такие как:

{{ MEDIA_URL }}css/some/file.css 

Так что в моей папке шаблонов у меня есть:

/templates/base.html 
/templates/someapp/childtemplate.html 

со всем CSS/JS в заголовке, как выше. Затем в шаблонах, специфичных для моей applicaiton я просто унаследовав базовый шаблон

Кроме
можно просмотреть СМИ, посетив

localhost:8000/media/ 

не проблема, поэтому привязок, кажется, делает его работу

+0

Но что вы делаете в своем шаблоне? Как вы выводите путь к медиафайлам? –

+0

Я отредактировал оригинал. У меня есть все мои шаблоны, наследуемые от базового шаблона (который имеет пути в заголовке). Это отлично подходит для общих представлений и шаблонов, но не для пользовательских? –

+0

Исправлено из-за ответов ниже. Для тех, кто читает это в будущем, прочитайте статью, представленную в ответе Омера, так как она представляет собой краткое изложение Контекстных процессоров и почему Generic Views добавляют их по умолчанию, в то время как пользовательские представления должны их вызывать. –

ответ

1

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

def media_url(request): 
    from django.conf import settings 
    return {'media_url': settings.MEDIA_URL} 

И в settings.py:

TEMPLATE_CONTEXT_PROCESSORS = ('myapp.context_processors.media_url',) 

Только не забудьте использовать RequestContext при визуализации шаблона. На вид:

from django.template import RequestContext 
return render_to_response("my_app/my_template.html", {'some_var': 'foo'}, context_instance=RequestContext(request)) 

Ваши шаблоны должны теперь отображаться правильно.

Подробнее об этом: http://www.b-list.org/weblog/2006/jun/14/django-tips-template-context-processors/

3

Убедитесь, что django.core.context_processors.media в вашей TEMPLATE_CONTEXT_PROCESSORS переменной в settings.py. Это позволяет использовать {{ MEDIA_URL }} в ваших шаблонах.

Edit: Как Даниил указал, я забыл упомянуть, что да, для того, чтобы воспользоваться вашей TEMPLATE_CONTEXT_PROCESSORS вам нужно передать context_instance=RequestContext(request) функции render_to_response с вашей точки зрения. Некоторые альтернативы тому, чтобы сделать это для каждого вида, - использовать декоратор render_to() в приложении стороннего разработчика django-annoying или просто импортировать и использовать direct_to_template вместо render_to_response, что является аккуратным трюком в том, что он автоматически использует RequestContext.

+0

Я забыл про django.core.context_processors.media. Это, конечно, лучше, чем я предложил. – OmerGertel

+1

Вам все равно нужно убедиться, что вы используете 'context_instance = RequestContext (request)', как указано в ответе Омера ниже. –

+0

Имея django.core.context_processors.media в настройках, вместе с ответом Омера его решил. Если бы я использовал производственный сервер, медиа было бы делом с помощью apache/cherokee. Я полагаю, это означало бы, что мне не нужен процессор контекста django для работы со СМИ? –