Pregunta

Se han hecho variaciones de esta pregunta, pero aún no puedo hacer que mis hojas de estilo se carguen correctamente cuando se representan mis plantillas.

Estoy tratando de servir medios estáticos del proceso de Django durante el desarrollo, lo cual es muy desaconsejado en producción, lo sé. Publicaré mi configuración y mi plantilla, y espero que alguien pueda ayudarme a entender dónde me estoy equivocando.

Tenga en cuenta que intenté seguir el ejemplo en el sitio web del proyecto Django, sin embargo, no menciona cómo referirse a sus hojas de estilo desde una plantilla. También probé muchas variaciones diferentes de lo mismo, por lo que mi código / configuración puede estar un poco alejado de lo que se describe.

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/

Dentro de mi plantilla:

<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>

Le aseguro que los archivos (plantillas / medios) están en el directorio correcto en mi sistema de archivos. Si hay alguna información adicional que necesito proporcionar, publique un comentario.


Editar:

Uno de los problemas que estaba teniendo era el uso de un '/' anteponiendo mis enlaces. Si la barra diagonal se antepone, el enlace se abre desde la raíz del sitio. Si no hay una barra diagonal, el enlace se abre en el nivel actual. Un ejemplo:

www.example.com/application/ tiene un enlace '' / app2 / y un enlace '' app3 / ''.
app2 se abrirá en www.example.com/app2/ y app3 se abrirá en www.example.com/application/app3/. Esto me confundió, creo.

, 'dso.ovramt.views.index'), ) if settings.DEBUG: urlpatterns += patterns('', (r'^media/(?P<path>.*)

Dentro de mi plantilla:

<*>

Le aseguro que los archivos (plantillas / medios) están en el directorio correcto en mi sistema de archivos. Si hay alguna información adicional que necesito proporcionar, publique un comentario.


Editar:

Uno de los problemas que estaba teniendo era el uso de un '/' anteponiendo mis enlaces. Si la barra diagonal se antepone, el enlace se abre desde la raíz del sitio. Si no hay una barra diagonal, el enlace se abre en el nivel actual. Un ejemplo:

www.example.com/application/ tiene un enlace '' / app2 / y un enlace '' app3 / ''.
app2 se abrirá en www.example.com/app2/ y app3 se abrirá en www.example.com/application/app3/. Esto me confundió, creo.

, 'django.views.static.serve', {'document_root': settings.MEDIA_ROOT}), )

Dentro de mi plantilla:

<*>

Le aseguro que los archivos (plantillas / medios) están en el directorio correcto en mi sistema de archivos. Si hay alguna información adicional que necesito proporcionar, publique un comentario.


Editar:

Uno de los problemas que estaba teniendo era el uso de un '/' anteponiendo mis enlaces. Si la barra diagonal se antepone, el enlace se abre desde la raíz del sitio. Si no hay una barra diagonal, el enlace se abre en el nivel actual. Un ejemplo:

www.example.com/application/ tiene un enlace '' / app2 / y un enlace '' app3 / ''.
app2 se abrirá en www.example.com/app2/ y app3 se abrirá en www.example.com/application/app3/. Esto me confundió, creo.

¿Fue útil?

Solución

Solo tuve que resolver esto yo mismo.

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>.*)

archivo de plantilla:

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

Con el archivo ubicado aquí:

"C:/Server/Projects/project_name/static/css/style.css"
, 'django.views.static.serve', {'document_root': settings.MEDIA_ROOT}), )

archivo de plantilla:

<*>

Con el archivo ubicado aquí:

<*>

Otros consejos

Django ya tiene un proceso de contexto para MEDIA_URL, consulte Documentación de Django .

Debería estar disponible de forma predeterminada (a menos que haya personalizado CONTEXT_PROCESSORS y haya olvidado agregarlo) en un RequestContext.

Normalmente hago mi propia etiqueta de plantilla simple porque Django no está dando archivos CSS / JavaScript. Apache lo hace, por lo que mi URL de medios suele ser http://static.mysite.com .

yourApp/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

Y en mi archivo de plantilla:

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

También puede hacer su propio preprocesador de contexto para agregar la variable media_url en cada plantilla.

Solo uso el nombre absoluto. A menos que esté ejecutando el sitio en una ruta profunda (o incluso si lo está), soltaría el .. y buscaría algo como:

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

Tengo un par de ideas, no sé cuál de ellas me funciona :)

  

Asegúrese de utilizar una barra diagonal final y que sea diferente de la configuración MEDIA_URL (ya que la misma URL no se puede asignar a dos conjuntos de archivos diferentes).

Eso es de http: //docs.djangoproject. com / es / dev / ref / settings / # admin-media-prefix

En segundo lugar, puede ser que esté confundiendo directorios en su sistema de archivos con rutas de URL. Intenta usar URL absolutas y luego refínalas.

Solo pensé en intervenir rápidamente. Si bien todas las propuestas aquí funcionan bien, y utilizo el ejemplo de Ty durante el desarrollo, una vez que llegue a producción, es posible que desee optar por servir archivos a través de un Apache directo, o cualquier otro servidor que esté utilizando.

Lo que hago es configurar un subdominio una vez que termine de desarrollar y reemplazar todos los enlaces a medios estáticos. Por ejemplo:

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

Las razones para hacer esto son dobles. Primero, parece que sería más lento que Django maneje estas solicitudes cuando no es necesario. En segundo lugar, dado que la mayoría de los navegadores pueden descargar archivos simultáneamente de 3 dominios diferentes, el uso de un segundo subdominio para sus archivos estáticos en realidad acelerará la velocidad de descarga de sus usuarios.

Otra cosa para agregar es que si tiene un servidor de medios separado en un subdominio / dominio diferente, puede deshabilitar las cookies para sus medios estáticos. Ahorra un poco de procesamiento y ancho de banda.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top