2017-09-13 1 views
2

je les trois fichiers suivants dans une application Django, avec le moteur de modèle étant Jinja2Jinja2 question de l'héritage de modèle multi-niveaux

skeleton.html

<head> 
    {% block head_content %} 
     <meta charset="utf-8"> 
     <title> {% if page_title %} {{ page_title }} | {% endif %} Bhargavi Books & Stationery </title> 
     <link rel="stylesheet" href="{{ static("css/semantic.min.css") }}"> 
     <link rel="stylesheet" href="{{ static("Icons/font-awesome.min.css") }}"> 
    {% endblock head_content %} 
</head> 

<body> 
    <div id="navigation"> 
    {% block navigation %} 
     <div class="ui three item menu"> 
      <a class="active item">Home</a> 
      <a class="item">New Bill</a> 
      <a class="item">View Bills</a> 
     </div> 
    {% endblock navigation %} 
    </div> 

    <div id="frame"> 
     {% block frame_content %} 
      <p> Body content goes here. Body for {{ content_name }}</p> 
     {% endblock frame_content %} 
    </div> 

    <div id="app"> 
     {% block app_content %} 
      <p> APP content goes here. Body for {{ content_name }}</p> 
     {% endblock app_content %} 
    </div> 

    {% block scripts %} 
     <script src="{{ static("js/jquery.js") }}"></script> 
     <script src=" {{ static("js/semantic.min.js") }} "></script> 
    {% endblock scripts %} 
</body> 

de base .html

{% extends "skeleton.html" %} 
{% from "macros/globalmacros.html" import 
      SUIIconList,SUISimpleList, 
      SUIImageLabel,SUILabel, 
      SUIActionInput,SUILabeledInput,SUIInput, 
      SUIDimmableActionCard,SUICard, 
%} 


{% block frame_content %} 
Frame Content 
{% endblock frame_content %} 

{% block scripts %} 

{{ super() }} 
<script src=" {{ static("js/globalmacros.js") }} "></script> 

{% endblock scripts %} 

dashboard.html

{% extends "base.html" %} 

<div> 
{% block body_content %} 
Body 3 
{% endblock body_content %} 
</div> 

<div> 
{% block app_content %} 

DASHBOARD 

{% endblock app_content %} 
</div> 

Dans cette configuration, Jinja rend tout sauf le "DASHBOARD" dans la dernière page. Cependant, quand j'ajoute un bloc vide « base.html », comme si ..

{% block app_content %} 

App content Goes here... 

{% endblock app_content %} 

Dans le modèle final « DASHBOARD » est imprimé. Est-ce que c'est un peu bizarre à Jinja? Ce comportement est-il défini dans tous les documents?

Répondre

1

Je comprends votre problème: vous avez le modèle A, le modèle B (étend le modèle A) et le modèle C (étend le modèle B). Un bloc est défini dans le modèle A, mais il n'apparaît pas dans la page qui utilise le modèle C, sauf si vous définissez ce bloc dans le modèle B. Si vous faites cela, , puis le bloc en question s'affiche. Premièrement: vous avez raison de comprendre que ceci est et non comment la hiérarchie de modèles Jinja est supposée fonctionner. Deuxièmement, je n'ai pas rencontré votre problème (trouvé un autre, cependant), et j'ai construit une preuve pour le démontrer. Voici ce que je l'ai fait (encore une fois, en utilisant Python 3 et Django 1.11):

$ python startproject myapp 

Dans le myapp/myapp/settings.py fichier, je mis à jour le moteur de template:

TEMPLATES = [ 
    { 
     'BACKEND': 'django.template.backends.jinja2.Jinja2', 
     'DIRS': [ 
      os.path.join(BASE_DIR, 'myapp/templates') # hack/should add `myapp` to INSTALLED_APPS instead 
     ], 
     'APP_DIRS': True, 
     'OPTIONS': { 
      'context_processors': [ 
       'django.template.context_processors.debug', 
       'django.template.context_processors.request', 
       'django.contrib.auth.context_processors.auth', 
       'django.contrib.messages.context_processors.messages', 
      ], 
     }, 
    }, 
] 

Dans myapp/myapp/urls.py, j'ai créé un fonction de visualisation fictive & itinéraire:

from django.conf.urls import url 
from django.shortcuts import render_to_response 

def home(request): 
    return render_to_response('dashboard.html') 

urlpatterns = [ 
    url(r'^$', home), 
] 

Et finalement, j'ai établi ces modèles, mais j'ai supprimé l'appel pour importer vos macros, avec toutes les instances de static().

Voici le fichier myapp/myapp/templates/skeleton.html:

<!doctype html> 
<html lang="en"> 
<head> 
    {% block head_content %} 
    <meta charset="utf-8"> 
    <title> {% if page_title %} {{ page_title }} | {% endif %} Bhargavi Books & Stationery </title> 
    {% endblock head_content %} 
</head> 

<body> 
<div id="navigation"> 
    {% block navigation %} 
    <div class="ui three item menu"> 
     <a class="active item">Home</a> 
     <a class="item">New Bill</a> 
     <a class="item">View Bills</a> 
    </div> 
    {% endblock navigation %} 
</div> 

<div id="frame"> 
    {% block frame_content %} 
    <p> Body content goes here. Body for {{ content_name }}</p> 
    {% endblock frame_content %} 
</div> 

<div id="app"> 
    {% block app_content %} 
    <p> APP content goes here. Body for {{ content_name }}</p> 
    {% endblock app_content %} 
</div> 

{% block scripts %} 
{% endblock scripts %} 
</body> 
</html> 

Voici le fichier myapp/myapp/base.html:

{% extends "skeleton.html" %} 

{% block frame_content %} 
    Frame Content 
{% endblock frame_content %} 

{% block scripts %} 
    {{ super() }} 
{% endblock scripts %} 

Et voici le fichier myapp/myapp/templates/dashboard.html:

{% extends "base.html" %} 

<div> 
    {% block body_content %} 
    Body 3 
    {% endblock body_content %} 
</div> 

<div> 
    {% block app_content %} 
    DASHBOARD 
    {% endblock app_content %} 
</div> 

Et voici la sortie, après avoir vu cette page dans mon navigateur:

<!doctype html> 
<html lang="en"> 
<head> 
    <meta charset="utf-8"> 
    <title> Bhargavi Books & Stationery </title> 
</head> 

<body> 
<div id="navigation"> 
    <div class="ui three item menu"> 
    <a class="active item">Home</a> 
    <a class="item">New Bill</a> 
    <a class="item">View Bills</a> 
    </div> 
</div> 

<div id="frame"> 
    Frame Content 
</div> 

<div id="app"> 
    DASHBOARD 
</div> 
</body> 
</html> 

Depuis tout cela fonctionne comme prévu *, ma conclusion est que vous pourriez avoir un problème avec le base.html fichier de modèle. Peut-être qu'il ne parvient pas à importer vos macros, et par la suite ne pas se comporter correctement? Je remarque une virgule flottante là-dedans, et je ne suis pas sûr si cela pourrait être problématique ou non. Je suggère d'utiliser le code ci-dessus comme point de départ, puis de rajouter lentement dans les parties que j'ai retirées, et peut-être que le problème deviendra visible/compréhensible.

* Une chose que j'ai trouvée étrange, que je ne comprends pas: le bloc body_content est complètement absent de ma sortie, sauf si je définis ce bloc dans le modèle skeleton.html. Cela ne fonctionne pas si je le définis dans le modèle base.html, ce qui me semble erroné, car alors nous ne sommes pas vraiment s'étendant ce deuxième modèle (base.html) ... donc est-ce que semble être quelque chose de bizarre là-bas? ... mais je n'ai pas été en mesure de rencontrer le problème original que vous avez décrit, alors peut-être que cela sera utile à cet égard, du moins.