2011-10-01 20 views
5

Sono stato in tutta la documentazione, e non ha senso per me. Ho eseguito collectstatic, ho impostato/static/directories sia nella mia app che nelle mie directory di progetto, ho aggiunto STATIC_URL e STATIC_ROOT al mio file settings.py (ma non ho idea di come sapere se sono impostati correttamente) e {{ STATIC_URL}} non viene ancora rivelato. Sembra tutto un bel po 'eccessivo solo per collegare html a css.Come posso servire i CSS per Django in fase di sviluppo?

Penso di essermi perso nei dettagli; qualcuno potrebbe fornire una ripartizione di alto livello di questa idea di file statici? Temo di poter avere istruzioni miste per le impostazioni di produzione e di sviluppo.

PIU ': Ecco il bit rilevante dal mio file settings.py:

INSTALLED_APPS = (
    'django.contrib.auth', 
    'django.contrib.contenttypes', 
    'django.contrib.sessions', 
    'django.contrib.sites', 
    'django.contrib.messages', 
    # Uncomment the next line to enable the admin: 
    'django.contrib.admin', 
    # Uncomment the next line to enable admin documentation: 
    # 'django.contrib.admindocs', 
    'django.contrib.staticfiles', 
    'dashboard.base', 
) 

TEMPLATE_CONTEXT_PROCESSORS = (
    'django.core.context_processors.debug', 
    'django.core.context_processors.i18n', 
    'django.core.context_processors.media', 
    'django.core.context_processors.static', 
    'django.contrib.auth.context_processors.auth', 
    'django.contrib.messages.context_processors.messages', 
) 

STATIC_ROOT = '' 
STATIC_URL = '/static/' 


STATICFILES_DIRS = (
    'C:/Users/Sean/Desktop/Work Items/dashboard/base/static/', 
) 

E questo è il codice che sto cercando di utilizzare nel mio modello:

<link rel="stylesheet" href="{{ STATIC_URL }}css/960.css" /> 

OK. Ho fatto le modifiche che tutti raccomandavano. Ecco la mia nuova urls.py:

from django.conf.urls.defaults import * 
from base.views import show_project 
from django.conf import settings 
from django.contrib.staticfiles.urls import staticfiles_urlpatterns 

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

urlpatterns = patterns('', 
# Example: 
# (r'^dashboard/', include('dashboard.foo.urls')), 

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

# Uncomment the next line to enable the admin: 
(r'^admin/', include(admin.site.urls)), 
('^show_project/$', show_project), 
) 

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

urlpatterns += staticfiles_urlpatterns() 

Mi manca qualcosa? Di solito i miei problemi si rivelano essere qualcosa di veramente semplice che i professionisti di CS danno per scontato, ma mi manca.

risposta

4

Ecco come il mio è impostato. Sembra che manchi il processore di contesto statico?

STATIC_ROOT e STATIC_URL

Nelle impostazioni.py utilizzato nello sviluppo:

STATIC_ROOT = '' 
STATIC_URL = '/static/' 

E il settings.py utilizzato sul mio server di produzione:

STATIC_URL = '//static.MYDOMAIN.com/' 
STATIC_ROOT = '/home/USER/public_html/static.MYDOMAIN.com/' 

Così, tutti i file statici si trovano in static/. Sul server di produzione, tutti questi file in static/ vengono raccolti su /home/USER/public_html/static.MYDOMAIN.com/ dove sono serviti da un server Web diverso (nginx nel mio caso) e non da Django. In altre parole, la mia applicazione django (in esecuzione su Apache) non riceve mai richieste di asset statici in produzione.

contesto del processore

Al fine per i modelli di avere la STATIC_URL variabili a loro disposizione, è necessario utilizzare il processore django.core.context_processors.static contesto, anche definito settings.py:

TEMPLATE_CONTEXT_PROCESSORS = (
    # other context processors.... 
    'django.core.context_processors.static', 
    # other context processors.... 
) 

SERVER ATTIVITA 'STATICA IN DEVELOPMENT

Django non riceve richieste di asset statici in p roduzione, tuttavia, in fase di sviluppo lasciamo semplicemente che Django serva il nostro contenuto statico. Usiamo staticfiles_urlpatterns in urls.py per dire a Django di servire richieste per static/*.

from django.contrib.staticfiles.urls import staticfiles_urlpatterns 
# .... your url patterns are here ... 
urlpatterns += staticfiles_urlpatterns() 
+0

Grazie - Ho il processore - puoi vederlo nel mio file sopra. Le impostazioni mi hanno aiutato, però: stavo usando percorsi assoluti nelle mie impostazioni STATIC_ROOT e STATIC_URL. L'ho risolto, ma penso che ho ancora bisogno di percorsi assoluti in STATICFILES_DIRS, giusto? – StormShadow

+2

@StormShadow, si potrebbe fare 'os.path.join (os.dirname (__ file __)," static ")', assumendo che i file statici si trovino nella stessa directory di 'settings.py'. – Geo

+0

Penso che non si menzioni se si stanno servendo i file usando il server di sviluppo Django o un altro server come nginx o Apache.Se il secondo problema potrebbe essere correlato alla configurazione del server di produzione non alle impostazioni di configurazione nel progetto. – kaysa

2

Dai un'occhiata a Serving static files in development. È necessario definire STATIC_URL e STATICFILES_DIRS per consentire a django.contrib.staticfiles di sapere dove cercare i file.

+0

destro. Questo è quello che sto facendo adesso, in realtà. Ma non sta funzionando. Sto usando le barre in avanti e avvio dei percorsi in C: /. È sbagliato? – StormShadow

+0

Per inciso, sono entrambi impostati sulla stessa cosa poiché non so quale imposta effettivamente la variabile {{STATIC_URL}}. Nessuno dei due sembra funzionare. – StormShadow

+0

Non dovrebbero essere uguali. STATICFILES_DIRS dovrebbe essere dove sono attualmente i tuoi file, STATIC_ROOT dovrebbe essere una cartella separata dove vuoi che i tuoi file finiscano quando vengono raccolti, e STATIC_URL dovrebbe essere il percorso che vuoi usare per accedere ai tuoi file quando usi il tuo sito/app –

2

L'idea alla base dell'idea dei file statici è che è possibile distribuire il file multimediale relativo allo sviluppo (css/js, ecc.) In base all'app e consentire all'applicazione di file statici di gestire e raccogliere tutte queste risorse dal proprio vari posti.

Così si dice all'app dei file statici dove cercare i file statici (dalle impostazioni STATICFILES_DIRS), dove copiarli (STATIC_ROOT) e quale percorso accedervi (STATIC_URL). Quando esegui collectstatic, cerca nelle directory e copia tutti i file che trova nella root statica.

Il vantaggio di questo è che è possibile gestire i file statici su un leve più fine:

project/app1/static/css/ # These are css/js for a particular app 
project/app2/static/css/ 
project/app3/static/css/ 
project/static/css # These might be general css/js for the whole project 
static/ # This is where the collectstatic command will copy files to 

e dopo averli collectstatic si avrà:

project/app1/static/css/ 
project/app2/static/css/ 
project/app3/static/css/ 
project/static/css 

static/app1/css/ 
static/app2/css/ 
static/app3/css/ 
static/css/ 

Quando si mette l'app/sito su un server di produzione, si consente al server web (apache, nginx) di gestire i file dicendogli di servire file multimediali in/static/o/media/direttamente, passando tutte le altre richieste all'applicazione. Tuttavia, durante lo sviluppo, è più semplice lasciare che il server di sviluppo lo faccia per te.

Per fare ciò, è necessario indicare esplicitamente al server qualsiasi richiesta di supporto in/static/(il tuo STATIC_URL). Nella tua urls.py, inserisci quanto segue (o simile)

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

Sì neanche questo funziona. Mi dà "NameError at/show_project/ nome 'impostazioni' non è definito" – StormShadow

+0

è necessario importare le impostazioni. Ho modificato la mia risposta –

+0

Grazie! Ma ancora venire con niente. Ho appena incollato l'altro codice che ho qui. Forse ho dimenticato qualcosa in questo? – StormShadow

0

Ho lo stesso problema e cercare molte risposte, ma nessuno mi dà la risposta giusta. Il problema è che non si usa RequestContext Penso. Si dovrebbe fare un RequestContext come parametro di template come

c = RequestContext(request, { 
    'foo': 'bar', 
}) 

Nel mio punto di vista è:

return render_to_response('parts/test2.html', RequestContext(request, locals())) 
Problemi correlati