Pergunta

pediram Variações desta pergunta, mas eu ainda sou incapaz de chegar em minhas folhas de estilo para carregar corretamente quando meus modelos são prestados.

Eu estou tentando servir mídia estática do processo de Django durante o desenvolvimento - que é fortemente desencorajada na produção, eu estou ciente. Vou postar minha configuração eo meu modelo, e espero que alguém pode me ajudar a entender onde eu estou indo errado.

Note que eu tentei seguir o exemplo no site do projecto Django, no entanto, não menciona como fazer referência a suas folhas de estilo a partir de um modelo. Eu também tentei muitas variações diferentes da mesma coisa, por isso o meu código / configurações podem ser um pouco fora do que está descrito.

settings.py

MEDIA_ROOT = 'D:/Dev Tools/django_projects/dso/media'
MEDIA_URL = '/media/'
ADMIN_MEDIA_PREFIX = '/media/'

urls.py

from django.conf.urls.defaults import *
from django.conf import settings
from django.contrib import admin

admin.autodiscover()

urlpatterns = patterns('',
    (r'^admin/(.*)', admin.site.root),
    (r'^ovramt/$', 'dso.ovramt.views.index'),
)

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

Dentro do meu template:

<head> 
<title> {% block title %} DSO Template {% endblock %} </title> 
<meta http-equiv="Content-Type" content="text/html;charset=utf-8" >
<link rel="stylesheet" type="text/css" href="../media/styles.css">
</head>

Eu lhe asseguro, os arquivos (templates / mídia) estão no diretório correto no meu sistema de arquivos. Se há alguma informação extra preciso fornecer, por favor postar um comentário.


Editar:

Um dos problemas que eu estava tendo foi o uso de um '/' prepending minhas ligações. Se a barra é prefixado, o link é aberto a partir da raiz do site. Se não houver nenhuma barra, o link é aberto no nível atual. Um exemplo:

www.example.com/application/ tem um link "/ app2 / e um link "app3 /".
app2 será aberta no www.example.com/app2/ e app3 será aberta no www.example.com/application/app3/. Este foi me confundindo eu acho.

Foi útil?

Solução

Eu só tinha que descobrir isso sozinho.

settings.py:

MEDIA_ROOT = 'C:/Server/Projects/project_name/static/'
MEDIA_URL = '/static/'
ADMIN_MEDIA_PREFIX = '/media/'

urls.py:

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

arquivo de modelo:

<link rel="stylesheet" type="text/css" href="/static/css/style.css" />

Com o arquivo localizado aqui:

"C:/Server/Projects/project_name/static/css/style.css"

Outras dicas

Django já tem um processo de contexto para MEDIA_URL, consulte o Django documentação .

Deve ser availbale por padrão (a menos que você personalizou CONTEXT_PROCESSORS e se esqueceu de adicioná-lo) em um RequestContext.

Eu costumo fazer a minha própria marca de modelo simples, porque Django não está dando arquivos CSS / JavaScript. Apache faz isso tão minha mídia url é geralmente http://static.mysite.com .

seuAplicativo / templatetags / media_url.py:

from django.template import Library
from yourapp.settings import MEDIA_URL
register = Library()

@register.simple_tag
def media_url():
    return MEDIA_URL

E no meu arquivo de modelo:

{% load media_url %}
<link href="{{ media_url }}css/main.css" rel="stylesheet" type="text/css">

Você também pode fazer seu contexto próprio pré-processador para adicionar a variável MEDIA_URL em cada modelo.

Eu só uso de nomenclatura absoluta. A menos que você estiver executando o site em um caminho de profunda (ou mesmo se você é), eu largar o .. e ir para algo como:

<link rel="stylesheet" type="text/css" href="/media/styles.css">

Eu tenho um par de ideias, eu não sei qual deles está trabalhando para mim:)

Certifique-se de usar uma barra, e de ter esta ser diferente da definição MEDIA_URL (já que o mesmo URL não podem ser mapeadas em dois conjuntos diferentes de arquivos).

Isso é do http: //docs.djangoproject. com / en / dev / ref / configurações / # admin-media-prefix

Em segundo lugar, pode ser que você está confundindo diretórios em seu sistema de arquivos com caminhos de URL. Tente usar urls absolutos e, em seguida, refiná-las para baixo.

Apenas pensei que eu gritei rapidamente. Enquanto todas as proposições aqui funcionam muito bem, e eu faço exemplo o uso de Ty durante o desenvolvimento, uma vez que você bateu de produção você pode querer opt para servir arquivos através de um Apache linha reta, ou qualquer que seja o servidor de outra pessoa que você está usando.

O que faço é a configuração I um subdomínio uma vez que eu sou feito em desenvolvimento, e substituir todos os links para mídia estática. Por exemplo:

<link rel="stylesheet" type="text/css" href="http://static.mydomain.com/css/style.css" />

As razões para isso são duas vezes. Em primeiro lugar, parece apenas como seria mais lento para ter Django lidar com essas solicitações quando não é necessário. Em segundo lugar, uma vez que a maioria dos navegadores pode realmente baixar arquivos simultaneamente a partir de 3 domínios diferentes, usando um segundo sub-domínio para seus arquivos estáticos vai realmente acelerar a velocidade de download de seus usuários.

Outra coisa a acrescentar é que se você tiver um servidor de mídia separado em um subdomínio do domínio / diferente, você pode desativar os cookies para sua mídia estáticos. Economiza um pouco de processamento e largura de banda.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top