2010-10-21 6 views
11

Pour illustrer ma question plus clairement, supposons que j'ai un modèle include.html avec le contenu:Modèle Django: Pourquoi bloquer dans un modèle inclus ne peut pas être remplacé par un modèle enfant?

{% block test_block %}This is include{% endblock %} 

J'ai un autre modèle appelé Parent.html avec un contenu comme celui-ci:

This is parent 

{% include "include.html" %} 

Maintenant, je créer un child.html appelé templated qui s'étend Parent.html:

{% extends "parent.html" %} 
{% block test_block %}This is child{% endblock %} 

Mon idée est que lors du rendu child.html, le test_block en ch Ild.html peut remplacer celui dans include.html. Selon ma compréhension, lorsqu'un modèle est inclus, il est inclus tel quel. Donc, dans mon cas, je pense que Parent.html équivaut à:

This is parent 

{% block test_block %}This is include{% endblock %} 

Alors child.html devrait être en mesure de remplacer test_block. Mais on dirait que ça ne peut pas. Pourquoi? Y at-il un travail autour?

Répondre

13

Lorsque vous incluez un modèle, il restitue le modèle, puis inclut le contenu affiché.

Des django docs:

La balise include doit être considérée comme une mise en œuvre de « rendre ce sous-modèle et inclure le code HTML », pas « analyser cette sous-modèle et inclure son contenu comme si elle faisait partie du parent ". Cela signifie qu'il n'y a pas d'état partagé entre les modèles inclus - chaque inclusion est un processus de rendu complètement indépendant.

Une solution serait d'avoir le modèle de l'enfant étendre le inclus modèle au lieu du modèle, y compris. Ensuite, incluez le modèle enfant.

Questions connexes