2012-06-02 17 views
16

Yo django çoklu şablon kalıtım - bu doğru stil mi?

yüzden bir base.html vardır:

<html> 
    <body> 
     <div id="header"> ... </div> 
     {% block main %}{% endblock %} 
     <div id="footer"> ... </div> 
    </body> 
</html> 

ve ben aynı zamanda kullanıcının mesajları gösteren bir sayfa:

{% extends base.html %| 
{% block main%} 
    <h1>welcome to yours posts hangout!</h1> 

     ... snazzy code here that shows all the posts ... 

{% endblock%} 

şimdi sorun şu ki belki başka var gibi sayfa:

{% extends base.html %| 
{% block main%} 
    <h1>look at all posts by all users!</h1> 

     ... snazzy code here that shows all the posts by all the users ... 

{% endblock%} 

Hepimiz mensa'ya ait olduğumuz için I have snazzy kodu yinelenen - iki kez (tautological eğlenceli!)

Bu kodu tekrarlamak istemiyorum - eğer büyük bir güçlük olacaksa yapacağım, ama aksi takdirde snazzy kodunun tanımlandığı bir sayfa gibi, ve daha sonra yukarıdaki küçük değişiklikleri ve (muhtemelen) üstündeki küçük değişiklikleri (muhtemelen) aşağı kaydırın.

Şablonlar konusundaki bilgilerim titrek olsa da, sanırım bunu yapmanın yolu budur. Daha iyi/standartlaştırılmış bir yolu var mı?

snazzy.html:

{% extends base.html %| 
    {% block aboveSnazzy%} 
    {% endblock %} 

     ... snazzy code here that shows all the posts by all the users ... 

    {% block belowSnazzy%} 
    {% endblock %} 
{% endblock%} 

ve daha sonra farklı parçaların her biri için, I sahip olabilir:

usersArea.html:

diğer parçaları için
{% extends snazzy.html %| 
    {% block aboveSnazzy%} 
     <h1>welcome to yours posts hangout!</h1> 
    {% endblock %} 


    {% block belowSnazzy%} 
     <h1>i didn't think this far ahead in the example</h1> 
    {% endblock %} 
{% endblock%} 

vs vs çok !

tamam, bu yüzden farklı bir üstbilgiye sahip olan bir parametreyi gönderebileceğimi biliyorum ya da neyin var - yukarıdakiSnazzy öğelerinin olduğunu bildiğimi, bilmiyorum, bir şey yapmayı ya da bir şey yapmayı düşündüğüm başka bir şablonu göstereyim önemsiz olmayan. Bunu yapmak için "yol" un üstünde detaylandırdığım şey nedir?

Şerefe!

cevap

19

Yo. :-)

Yanıt, şablonlarınızın ne kadar ortak olduğuna bağlıdır.

  • onlar sadece sitenizin bazı bölümün sayfaları veya örnek için şablonlar, ortak bir çok varsa

    çok yaygın strucure var, açıklanan yolu en iyisidir. Başka bir temel şablon yapın, daha fazla blok ekleyin ve formu devralın. Sadece Şablonlarınız ortak lapa yoksa örneğin

    için, blok için
    {% extends base.html %| 
    {% block page_heading %}{% endblock %} 
        ... snazzy code here that shows all the posts by all the users ... 
    {% block extra_content %}{% endblock %} 
    
  • biraz daha açıklayıcı isimleri kullanmalıdır düşünüyorum, ama içerik hisseleri bazı özel blok, başka bir durum. Burada uygun miras yapısını yapmak zor. Böylece {% include %}'u buradan kullanabilirsiniz: Örneğin, postaları (tüm gönderileri gösteren snazzy kodu) _list_posts.html deyin. Gönderileri (tüm gönderileri gösteren gizli kod), örneğin _list_posts.html gibi başka bir şablon oluşturabilirsiniz. Daha sonra bunları çocuk şablonlarında kullanın.

    {% extends base.html %| 
    {% block main%} 
    <h1>welcome to yours posts hangout!</h1> 
    {% include '_list_posts.html' %} 
    {% endblock%} 
    

    Ayrıca bunun için inclusion tag kullanabilirsiniz.

Hangi yolu seçmelisiniz? Soruyu cevaplamaya çalışın: (Bu iki şablonun ortak ataları olabilir mi?) Eğer evetse, ilk varyasyona gidin, eğer hayır ise - ikinci için.

+0

Thankyo! Include/inclusion etiketlerini bilmiyordum. Onlara bir bakacağım! – bharal