Ben de şablon dosyalarımda tekrarlanan bir {% block%} ihtiyacı ile karşılaştım. Sorun şu ki, Django koşullu her iki durumda da Django {% block%} kullanılmasını istiyorum ve {% block%} geçerli dosyayı genişletebilecek sonraki dosyalar tarafından üzerine yazılabilir olmasını istiyorum. (Yani bu durumda, istediğim şey kesinlikle bir değişkenden çok bir blok, çünkü onu teknik olarak yeniden kullanmıyorum, sadece bir koşulun her iki ucunda da görünüyor.
Sorun:
Aşağıdaki Django şablon kodu bir Şablon Sözdizimi Hatası ile sonuçlanacaktır, ancak bunun bir koşulda yeniden kullanılması için geçerli bir "istek" olduğunu düşünüyorum (IE, Django ayrıştırıcısı neden sözdizimini BOTH uçlarında doğruluyor? bir koşullu, yalnızca GERÇEK koşulunu doğrulaması gerekmez mi?)
# This example shows a {{ DEBUG }} conditional that loads
# Uncompressed JavaScript files if TRUE
# and loads Asynchronous minified JavaScript files if FALSE.
# BASE.html
{% if DEBUG %}
<script src="{{MEDIA_URL}}js/flatfile.1.js"></script>
<script src="{{MEDIA_URL}}js/flatfile.2.js"></script>
<script src="{{MEDIA_URL}}js/flatfile.3.js"></script>
<script type="text/javascript">
{% block page_js %}
var page = new $site.Page();
{% endblock page_js %}
</script>
{% else %}
<script type="text/javascript">
// load in the PRODUCTION VERSION of the site
// minified and asynchronosly loaded
yepnope([
{
load : '{MEDIA_URL}}js/flatfiles.min.js',
wait : true,
complete : function() {
{% block page_js %} // NOTE THE PAGE_JS BLOCK
var page = new $site.Page();
{% endblock page_js %}
}
}
)];
</script>
{% endif %}
# ABOUT.html
{% extends 'pages/base.html' %}
{% block page_js %}
var page = new $site.Page.About();
{% endblock page_js %}
Çözüm:
Koşullu olarak bir {% blok%} birden fazla eklemek için bir {% include%} kullanabilirsiniz. Bu benim için çalıştı çünkü Django sözdizimi denetleyicisi yalnızca GERÇEK {% include%} öğesini içeriyor. Aşağıdaki sonuca bakın:
# partials/page.js
{% block page_js %}
var page = new $site.Page();
{% endblock %}
# base.html
{% if DEBUG %}
<script src="{{MEDIA_URL}}js/flatfile.1.js"></script>
<script src="{{MEDIA_URL}}js/flatfile.2.js"></script>
<script src="{{MEDIA_URL}}js/flatfile.3.js"></script>
<script type="text/javascript">
{% include 'partials/page_js.html' %}
</script>
{% else %}
<script type="text/javascript">
yepnope([
{
load : '{MEDIA_URL}}js/flatfiles.min.js',
wait : true,
complete : function() {
{% include 'partials/page_js.html' %}
}
}
)];
</script>
{% endif %}