سؤال

أفعل HTML/CSS عن طريق التجارة ، وأنا أعمل على مشاريع Django وخارجها كمصمم قالب. أنا أعمل حاليًا على موقع يستخدم Jinja2 ، الذي كنت أستخدمه لمدة أسبوعين تقريبًا. لقد اكتشفت للتو من خلال قراءة الوثائق التي مفادها أن Jinja2 لا يدعم ميراث قالب متعدد المستوى ، كما في لا يمكنك فعل أكثر من واحد

{% extends "foo" %}

لكل عرض. الآن أنا متأكد من أنه يمكنك القيام بذلك في Django ، وهو أمر قوي لأنه يمكنك تحديد قالب أساسي ، تحديد 3 أو 4 قوالب بناءً على ذلك ، ثم بناء لحم صفحاتك باستخدام تلك القوالب الأساسية. أليس الهدف من الميراث ، لذا لديك المزيد من القوة للتجريد ، لذا فإنك فقط العبث برمز فريد من نوعه؟

في أي حال ، ليس لدي أي فكرة عما يجب فعله هنا. لا أعرف ما إذا كان هناك طريقة ما يمكنني القيام بها والتي ستعمل كما يمكن أن تعمل مع قوالب Django. أنا لست خبيرًا بالضبط في Django أو Jinja (2) ولكن يمكنني تقديم أي معلومات مطلوبة.

هل كانت مفيدة؟

المحلول

الطريقة التي صاغتها الوثائق ، بدا أنها لم تدعم مستويات الميراث (N) بعمق.

على عكس Python Jinja لا يدعم الميراث المتعدد. لذلك يمكنك الحصول على علامة واحدة فقط تسمى لكل عرض.

لم أكن أعرف أنها مجرد قاعدة تقول أن 1 تمتد لكل قالب .... أعرف الآن ، ببعض المساعدة من قناة Jinja IRC.

نصائح أخرى

واحدة من أفضل طريقة لتحقيق مستوى متعدد من templating باستخدام Jinja2 هو استخدام "Let Your You"base_layout.html"كقالب أساسي الخاص بك

<!DOCTYPE html>
<title>Base Layout</title>
<div>
  <h1>Base</h1>
  .... // write your code here
  {% block body %}{% endblock %}
</div>

ثم تريد أن يكونchild_layout.html"هذا يمتد" base_layout.

{% include "base_layout.html" %}
  <div>
  ... // write your code here
  </div>
{% block body %}{% endblock %}

والآن يمكن أن تمتد صفحتك فقطchild_layout.html'وسيكون لها كلاهما base_layout.html و child_layout.html

{% extends "child_layout.html" %}
{% block body %}
  ...// write your code here
{% endblock %}

جرب هذا ، هذا العمل من أجلي بفضل إجابة @ixm.

base.html

<html xmlns="http://www.w3.org/1999/xhtml">
    <body>
      {% block content %}{% endblock %}
    </body>
</html>

content.html

{% extends "base.html" %}
{% block content %}
<table>
  <tr>
  {% include "footer.html" %}
  </tr>
</table>
{% endblock %}

تذييل. html

{% block footer %} <td> test</td>{% endblock %}

واتصل مع

env = Environment(loader=FileSystemLoader(os.path.join(path, "Layouts")))
template = env.get_template('content.html')
html = template.render()
print html

واجهت مؤخرًا نفس القضية. أردت أن أرث العديد من قوالب الأطفال وعملت. لتوضيح ذلك ، أود أن أريكم حلًا يعمل بالنسبة لي:

كان لدي ملف base.html يحتوي على محتوى حظر وتم تمديده بواسطة manage.html. وهذا manage.html يحتوي على كتلة sub_manage تمتد بواسطة Internet_market.html ، لذلك يبدو بصريًا:

|- base.html (block content)
|--manage.html (extends base.html)
|---sub_manage.html (extends manage.html)

عندما قدمت ذلك ، عمل كل شيء على ما يرام ، مما يعني أنه يمكنك الحصول على عدة {٪ يمتد ٪} في عرض واحد. الشيء الوحيد هو أنه إذا كنت تستخدم روابط نسبية لملفات CSS أو JS الخاصة بك ، فقد لا تعمل ، بل إنها ستجعلها ، لكنها لن تجد ملفات CSS/JS. مثل:

<head>  
<script src="//ajax.googleapis.com/ajax/libs/jquery/1.11.1/jquery.min.js"></script>
<link rel="stylesheet" type="text/css" href="../static/css/bootstrap.min.css">
<script type="text/javascript" src="../static/js/bootstrap.min.js"></script>
<style type="text/css">
</head>

في هذه الحالة ، عليك استخدام الروابط الديناميكية باستخدام url_for. مثل:

<script src="//ajax.googleapis.com/ajax/libs/jquery/1.11.1/jquery.min.js"></script>
<link rel="stylesheet" type="text/css" href="{{url_for("static", filename = "css/bootstrap.min.css")}}">
<script type="text/javascript" src="{{url_for("static", filename = "js/bootstrap.min.js")}}"></script>
<style type="text/css">

انظر الوثائق تمتد, بما فيها, ، و الاستيراد.

يوفر هذا وسيلة للحصول على الوظائف من ملفات متعددة لأغراض مختلفة ويختلف عن عمق التعشيش. يمكنك أن يكون لديك قالب يمتد بشكل مثالي لقالب يمتد قالب ...

يمكنك استخدام الطريقة التالية لدمج المحتويات المختلفة في تصميم واحد. html لتصميمات التخطيط المختلفة:

{% if instance == 'type1' %}

{% elif instance == 'type2' %}

{% else %}

{% endif %}

...و اتصل:

render_template('layout', instance='%s' % instance)

في كود بيثون.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top