Jump to content
Sign in to follow this  
HecKel

Usar CSS nas templates Django, como?

Recommended Posts

HecKel

Boas!

Estou (novamente) com um problema quanto a isto, queria ver se avançava com o meu projecto, mas sem ver o efeito final as coisas complicam um bocado...

Tenho a seguinte hierarquia de pastas:

http://img14.imageshack.us/img14/1684/hierarquia.png

Onde a pasta "lafora" é o projecto em si, enquanto que a pasta "laforapublic" será a localização dos templates de acesso público (tenho seguido o tutorial do django).

A questão é, tenho a seguinte linha no ficheiro "menu.html" na psta \laforapublic:

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

Este ficheiro menu.html é o ficheiro "base" das templates publicas, está criado da seguinte forma:

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="content-type" content="text/html; charset=utf-8" />
<title>{% block title %}{% endblock %}</title>
<meta name="keywords" content="" />
<meta name="description" content="" />
<link href="css/style.css" rel="stylesheet" type="text/css" media="screen" />
</head>
<body>
    <div id="header">
        <h1>{% block subtitle %}{% endblock %}</h1>
    </div>
    <div id="menu">
        <ul>
            <li><a href="#">Menu 1</a></li>
            <li><a href="#">Menu 2</a></li>
            <li><a href="#">Menu 3</a></li>
            <li><a href="#">Menu 4</a></li>
            <li><a href="#">Menu 5</a></li>
        </ul>
    </div>
    {% block content %}{% endblock %}
</body>
</html>
No entanto o CSS não me aparece visivel, já meti a pasta css em todos os locais possíveis e imaginários mas nada :X

Ideias?

Share this post


Link to post
Share on other sites
JoaoRodrigues

Depois de umas horitas de volta disto, cheguei à conclusão. Servir ficheiros estáticos no django é uma valente confusão. O melhor mesmo é, tal como eles recomendam, usar um servidor externo. Mas, e se não tivermos um à mão, ou se não nos apetecer instalar o apache só para ver como fica a nossa página?

A solução acabou por ser estupidamente simples :x

No meu settings.py tenho:

MEDIA_URL = '/media/'

MEDIA_ROOT = '/path/website/media/'

No meu urls.py:

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

urlpatterns = patterns('',
    # Example:
    # (r'^website/', include('website.foo.urls')),
    
    (r'^quext/$', 'website.quext.views.home'),
    (r'^quext/results/$', 'website.quext.views.results'),
    (r'^site_media/(?P<path>.*)$', 'django.views.static.serve',
            {'document_root': '/home/joao/Desktop/QueXT/website/media'}),

Ora, podia, segundo a malta esperta do django, fazer isto também, para me facilitar a vida.

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

urlpatterns = patterns('',
    # Example:
    # (r'^website/', include('website.foo.urls')),
    
    (r'^quext/$', 'website.quext.views.home'),
    (r'^quext/results/$', 'website.quext.views.results'),
    (r'^site_media/(?P<path>.*)$', 'django.views.static.serve',
            {'document_root': settings.MEDIA_ROOT}),

Depois, trata-se de chamar no meu template o caminho certo:

<link rel="stylesheet" type="text/css" href="/site_media/css/initial.css" media="screen" />

Gil, tás com sorte que eu também estou de volta ao Django :P

Share this post


Link to post
Share on other sites
HecKel

Pá, deve haver mais algum detalhe que me falta...

ViewDoesNotExist: Could not import lafora.forum.views.django.views.static. Error was: No module named django.views.static

[18/Mar/2009 18:15:01] "GET /site_media/css/style.css HTTP/1.1" 500 1587

Continua a dar-me este erro... :|

Código que tenho:

settings.py

MEDIA_ROOT = 'C:/Documents and Settings/Gil Sousa/Os meus documentos/Projectos/laforapublic/static_media/'

MEDIA_URL = '/static_media/'

urls.py

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

# Uncomment the next two lines to enable the admin:
from django.contrib import admin
admin.autodiscover()

urlpatterns = patterns('lafora.forum.views',

    # Uncomment the admin/doc line below and add 'django.contrib.admindocs' 
    # to INSTALLED_APPS to enable admin documentation:
    # (r'^admin/doc/', include('django.contrib.admindocs.urls')),

    # Uncomment the next line to enable the admin:
(r'^admin/(.*)', admin.site.root),
    (r'^forum/', include('lafora.forum.urls')),
    (r'^site_media/(?P<path>.*)$', 'django.views.static.serve', {'document_root': settings.MEDIA_ROOT}),
)

Share this post


Link to post
Share on other sites
JoaoRodrigues

Ah, essa merece um facepalm :P

urlpatterns = patterns('lafora.forum.views', <----

'lafora.forum.views' é sempre acrescentado à localização das views. Daí, quando pões, 'django.views.static.serve', ele concatena as 2, obviamente não encontrando. Alternativas há 2, só te explico 1 que tou sem tempo :x

Tira o 'lafora.forums.views' do inicio da tupla e acrescenta-o a cada das tuas views. Outra coisa, site_media no urls.py e static_media no settings.py. Cuidado com isso :)

EDIT:

A segunda alternativa é, como só vais usar isso para development, e no servidor final tens um dominio a parte para a media, crias isto no urls.py:

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

Assim, qd tiras o DEBUG == True do settings.py, ele passa a não usar esta parte do código.

Share this post


Link to post
Share on other sites

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now
Sign in to follow this  

×
×
  • Create New...

Important Information

By using this site you accept our Terms of Use and Privacy Policy. We have placed cookies on your device to help make this website better. You can adjust your cookie settings, otherwise we'll assume you're okay to continue.