Soru Django çok seviyeli şablon uzanır ve iç içe bloklar


Aşağıda gösterilen üç html şablon dosyasına sahip olduğumu varsayalım. HTML sadece noktayı göstermek için en azdır.

Ekstra_head_content adlı bir bloğun içinde extra_head_content adlı bir bloğun bir şekilde yerleştirilmesi mümkün mü? Buradaki fikir, üçüncü düzey şablonun extra_head_content adlı bir blok sağlamasına izin vermektir. Yukarıdaki şablon bu içeriği alır, extra_head_content adlı bloğuna ekler ve bu birleştirilmiş bloğu üst şablonuna sunar.

Aslında, devralınan şablon dosyaları arasında blok yerleştirme arıyorum.

Çözmeye çalıştığım tam senaryo, herhangi bir şablonun başlık öğesine ekstra javascript veya css dosyaları ekleyebilmesi gerektiğidir. Bununla birlikte, en düşük şablon, yuvada kaç tane seviyenin kaldığıyla ilgilenmemelidir. Benzer şekilde, bir ara şablon tarafından sağlanan ekstra başlık içeriği, terminal şablonunun blok elemanı tarafından üzerine yazılmamalıdır.

base.html

<html>
<head>
    <link rel="stylesheet" type="text/css" href="/static/css/reset.css" />
    {% block extra_head_content %}{% endblock %}
</head>
<body>{% block content %}{% endblock %}
</html>

account.html

{% extends "base.html" %}

{% block extra_head_content  %}
    <link rel="stylesheet" type="text/css" href="/static/css/account.css" />
    {% block extra_head_content  %}{% endblock %}
{% endblock %}

{% block content %}
    <div id="menu">...</div>
    {% block account_content %}{% endblock %}
{% endblock %}

account_profile.html

{% extends "account.html" %}

{% block extra_head_content  %}
    <link rel="stylesheet" type="text/css" href="/static/css/edit_profile.css" />
{% endblock %}

{% block account_content %}
    Welcome to your profile
{% endblock %}

25
2018-01-03 19:23


Menşei




Cevaplar:


Hayır, ama sen kullanabilirsin {{ block.super }}:

{% block extra_head_content  %}
    {{ block.super }}
    <link rel="stylesheet" type="text/css" href="/static/css/account.css" />
{% endblock %}

50
2018-01-03 19:28





Django-sekizai modül kolaylıkla css ve javascript ekleyerek ilgilenir:

#base.html
{% load sekizai_tags %}
# define your template, declaring blocks for inheriting templates:
{% block content %}
{% endblock content %}
# at the bottom of the body:
{% render_block "js" %}
</body>
</html>

#my_template.html
{% extends "base.html" %}
{% load sekizai_tags %}
{% block content %}
# content goes here...
# so does the addtoblock tag
    {% addtoblock "js" %}
        <script src="my/awesome/script.js"></script>
    {% endaddtoblock %}
{% endblock content %}
# Note no addtoblock tags outside the block-endblock tags

sekazai dokümanlar Bu sistemi kullanmak için uyarılar açık, yani:

  1. render_block sadece blok etiketlerinin dışında kullanılmalıdır
  2. render_block, dahil edilen şablonlarda kullanılamaz
  3. dahil şablonda kullanıldığında blok etiketleri içinde addtoblock kullanılmalıdır

2
2017-12-28 12:59



django-versai çok yararlı ... Django ile birlikte gönderilmek üzere herhangi bir referans bulamıyorum. AFAICT, hala üçüncü taraf bir modül - Anentropic
Onu aldığın için teşekkürler! Django CMS 2.2'de ve daha sonra da var ama Django'nun kendisinde değil gibi görünüyor, bu yüzden cevabımı düzelttim. - James Fletcher