2016-04-13 38 views
6

Bir Django projesinde, şablona statik bir dosya eklemek istiyorum. Proje yapısı şöyledir: news.html yılındadjango: Şablonda statik dosya nasıl eklenir?

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

, şu varsayımsal formatı ile main.js dahil etmek istiyorum:

{% load staticfiles %} 
... 

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

bunu yapmak nasıl?

+0

Neden aşağı oy? Ve soruyu kapatmayı önerdi, çünkü ** çok mu geniş **? Delilik bu!Bu soru çok belirgindir: "include" ve "static" gibi iki şablon etiketini statik bir dosya ekleyebileceğim şekilde nasıl bütünleştirebilirim? –

+0

[Zahmet gerekli mi gösteriliyor?] (Http://meta.stackoverflow.com/q/288176/1324033) -> "" İş emirleri "..." çok geniş "olarak işaretlenmelidir." – Sayse

+1

Şablonunuzda statik bir dosya da dahil olmak çok yaygın bir şey değildir; Çözmeyi denediğiniz sorun için gerçekten doğru çözüm olduğundan emin misiniz? STATIC_ROOT'unuzu TEMPLATE_DIRS'e dahil etme, hatta statik dosya için kendi şablon yükleyicinizi yazma gibi geçici çözümler var, ancak yapılması gereken garip bir şey var ve daha sonra sizi kıçına sokmak için geri dönebilir. – koniiiik

cevap

1

Ben fikirlerin bir çift var: Yapabileceğin Ne (Etmezdim rağmen) ayrıca statik dosyaları dahil etmek için ayarlarınızı değiştirmektir.

yapmak olacağını yapmak kolay şey

Eğer filesystem loader etkin varsa ve TEMPLATES[0]['DIRS'] (daha önce TEMPLATE_DIRS) statik dosyalarını içeren alakalı dizini dahil. Uyarılar, DIRS da listelenmedikçe, yüklü uygulamalarınızın içinde yer alan statik dosyaları otomatik olarak almamalarıdır. Başka bir seçenek STATIC_ROOT kullanmak olacaktır, ancak bu, normalde geliştirme sırasında yapmanız gereken statik dosyayı değiştirdiğinizde yalnızca collectstatic çalıştırırsanız çalışır. Başka bir tuzak, yalnızca yerel statik depolama ile çalışacaktır, eğer herhangi bir CDN kullanmıyorsanız veya başka bir host/network/neyse statik dosyalarınızı barındırmıyorsanız.

Yapabileceğiniz diğer bir şey, statik şablon API'sini statik şablonlar olarak yüklemek için kullanacağınız kendi şablon yükleyicinizi yazmaktır. Bu biraz daha ilgili, ancak bunların nasıl saklandıklarına ve sunulduğuna bakılmaksızın statik dosyalara erişebilmeli.

Seçeneklerden birini seçerseniz, yine de dikkatli olmanız gerekir. Örneğin, şablon olarak eklediğiniz statik dosyaların HTML’ye dahil edilmesini veya içeride kullandığınız başka herhangi bir bağlamı içermemesini sağlamalısınız. Kaçış olmayacak.

İstemcinin yapması gereken istek sayısını optimize etmeye çalışıyorsanız, daha iyi yollar vardır. Statik dosyalarınızı önceden işleyecek ve küçültecek bazı boru hatlarını uygulamanız daha olasıdır. CSS/JS'nin önemli bir parçasını HTML'ye eklemek, müşterilerin önbelleğe alma işleminden yararlanmasını imkansız hale getirerek, aynı statik içeriği tekrar tekrar indirmeye zorlayarak, performansı olumsuz etkileyebilir.

Düzenleme: Sadece bazı dinamik JavaScript değişkenleri eklemek istediğinizden, bu statik bir dosya değil. Gerçekten istediğiniz şey, JavaScript kodu içeren bir şablon oluşturmak ve statik dosyaları şablon olarak kullanmakla uğraşmak değil. Her javascript'in statik bir dosya olması gerektiğini söyleyen bir kural yoktur. Dinamikse, statik bir dosya değil.

Kayıt için bu, XY problem'un tipik bir örneğiydi. Sorun X, şablonları işlerken JavaScript değişkenlerine dinamik olarak atanıyordu. Şablonları statik bir çözüm olarak potansiyel bir çözüm olarak dahil ettiniz, ancak sonra problemli bir problemle uğraştınız, ki bu da şablonlara statik dosyaların nasıl ekleneceğini bilmiyorsunuz.

+0

Güzel açıklama. Noktasına doğru. –

3

include yönergesi yalnızca dosyayı şablon dizinlerinde arar.

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