2016-04-13 41 views
6

In un progetto Django, vorrei includere un file statico in un modello. Quello che segue è la struttura del progetto:django: come includere un file statico in un modello?

proj/ 
    main/ 
     static/ 
     main/ 
      js/ 
       main.js 
    news/ 
     templates/ 
     news/ 
      news.html 

In news.html, vorrei includere il main.js con il formato seguente ipotetica:

{% load staticfiles %} 
... 

{% include {% static 'main/js/main.js' %} %} 

Come posso fare?

+0

Perché il voto negativo? E ha suggerito di chiudere la domanda perché è ** troppo ampia **? È folle!Questa domanda è molto specifica: come faccio ad integrare i due tag di template 'include' e' static' in modo che possa includere un file statico? –

+0

[È necessario mostrare lo sforzo?] (Http://meta.stackoverflow.com/q/288176/1324033) -> "" Gli ordini di lavoro "... devono essere contrassegnati come" troppo generici "." – Sayse

+1

L'inclusione di un file statico nel modello non è una cosa molto comune da fare; sei sicuro che sia davvero la soluzione giusta per qualsiasi problema tu stia cercando di risolvere? Ci sono soluzioni alternative, come includere STATIC_ROOT in TEMPLATE_DIRS, o anche scrivere il proprio caricatore di template per i file statici, ma è una cosa strana da fare, e potrebbe tornare a morderti nel culo in seguito. – koniiiik

risposta

1

Ho un paio di idee.

La cosa più semplice da fare sarebbe quella di assicurarsi di avere il filesystem loader abilitato, e si include la directory contenente i file statici rilevanti in TEMPLATES[0]['DIRS'] (in precedenza TEMPLATE_DIRS). L'avvertenza è che non raccoglierà automaticamente i file statici contenuti nelle applicazioni installate, a meno che non li elenchi anche in DIRS. Un'altra opzione potrebbe essere quella di utilizzare STATIC_ROOT, ma funzionerà solo se si esegue collectstatic ogni volta che si modifica il file statico, che normalmente non è necessario eseguire durante lo sviluppo. Un altro trabocchetto è che funzionerà solo con l'archiviazione statica locale, non se si utilizza un CDN o altrimenti si ospitano i file statici su un host/rete/altro.

L'altra cosa che puoi fare è scrivere il tuo caricatore di template che userà l'API dei file statici per caricare le statiche come modelli. Questo è un po 'più complicato, ma dovrebbe essere in grado di accedere ai file statici indipendentemente da come sono memorizzati e serviti.

Se si sceglie un'opzione, è necessario fare attenzione. Ad esempio, dovrai assicurarti che i file statici che includi come modelli siano sicuri da includere in HTML o in qualsiasi altro contesto in cui li stai utilizzando. Non ci sarà alcuna fuga in corso.

Nel caso si stia tentando di ottimizzare il numero di richieste che il cliente deve effettuare, ci sono modi migliori. Molto probabilmente è meglio implementare una pipeline che pre-processerà e ridurrà i file statici. Includere qualsiasi porzione significativa di CSS/JS nel codice HTML renderà impossibile ai clienti di sfruttare il caching, costringendoli a scaricare nuovamente lo stesso contenuto statico più e più volte, con un probabile impatto negativo sulle prestazioni.

Modifica: Dato che si desidera includere solo alcune variabili JavaScript dinamiche, non si tratta di un file statico. Quello che vuoi veramente è creare un modello contenente codice JavaScript e non scherzare con la gestione di file statici come modelli. Non esiste una regola che possa dire che ogni javascript deve essere un file statico. Se è dinamico, non è un file statico.

Per la cronologia, questa era una tipica istanza di XY problem. Problema X stava assegnando dinamicamente i valori alle variabili JavaScript durante il rendering dei modelli. Ti è venuto in mente di includere i file statici nei modelli come una potenziale soluzione, ma poi ti sei bloccato con il problema Y, che era che non sapevi come includere i file statici nei modelli.

+0

Bella spiegazione. Dritto al punto. –

3

La direttiva include cerca solo il file nelle directory dei modelli. Quello che potresti fare (anche se non lo farei) è modificare le tue impostazioni per includere anche i file statici:

TEMPLATE_DIRS = [ 
    ... 
    "path/to/your/statics", 
]