2010-04-04 10 views
2

J'ai un modèle qui affiche des éléments d'objet avec des liens hypertexte vers d'autres parties de mon site. J'ai une autre fonction qui affiche les versions passées du même objet. Dans cet affichage, je ne veux pas les hyperliens. Je suppose que je ne peux pas désactiver dynamiquement les hyperliens. J'ai donc inclus les deux versions dans le même modèle. J'utilise une instruction if pour afficher la version avec lien hypertexte ou la version en texte brut. Je préfère les garder dans le même modèle car si je dois changer le format d'un, il sera facile de l'appliquer à l'autre.Django héritage conditionnel modèle

Le modèle étend framework.html. Framework a un système de fil d'Ariane et il étend base.html. Base a un système de menu supérieur simple.

Alors, voici mon dilemme. Lorsque vous affichez les données de lien hypertexte standard, je veux voir le menu principal et la chapelure. Mais lors de la visualisation des données en texte brut version précédente, je ne veux que les données, pas de menu, pas de chapelure. Je ne sais pas si c'est possible compte tenu de mon design actuel. J'ai essayé d'avoir le framework hérité du template primaire pour que je puisse choisir d'appeler l'un ou l'autre framework (et afficher le fil d'Ariane), ou le template lui-même, en sautant ainsi le fil d'Ariane. Si framework.html étend un modèle spécifique, je perds la possibilité de l'afficher dans d'autres modèles.

J'ai essayé d'écrire une instruction if qui afficherait respectivement le bloc top_menu et le bloc nav_menu de base.html et framework.html. Cela écraserait leurs blocs et me permettrait d'éteindre ces éléments conditionnels à l'if. Malheureusement, cela ne semble pas être conditionnel. si les éléments du bloc sont dans le template, entourés d'un if ou non, je perds les menus.

J'ai pensé à utiliser {% include%} pour ramasser les miettes de pain et un menu supérieur séparé. Dans ce cas, je devrai l'inclure tout le temps. Plus d'héritage. Est-ce la meilleure option compte tenu de mes exigences?

Répondre

2

Vous pouvez placer vos liens hypertexte à l'intérieur d'un block qui est remplacé par les modèles de chargement.

Disons que vous avez votre framework.html comme ceci:

{% extends "base.html" %} 

<html>...<body>... 
{% block hyperlinks %} 
your hyperlinks here 
{% endblock %} 
rest of the code 
</body></html> 

Vous pouvez alors créer quelque chose d'un modèle nolinks.html et de l'utiliser

{% extends "framework.html" %} 
{# here you'll have everything from framework 
but now we disable the breadcrumbs #} 
{% block hyperlinks %}{% endblock %} 

Si vous obtenez les données du passé, vous pouvez alors utiliser nolinks pour rendre au lieu de cadre.

J'espère que cela aide.

+0

J'aime vraiment cette idée. Cela me fait partie du chemin.Le problème est que j'aurais toujours besoin d'une page "nolinks" pour chaque modèle dont j'avais besoin pour désactiver les menus. Étant donné que la page nolinks étend un modèle spécifique, elle ne fait référence qu'à un seul à la fois. J'ai essayé d'inclure la page nolinks au lieu de l'appeler directement, mais il apparaît que l'inclusion ne reprend pas les balises qui désactivent les sections nécessaires –

+0

Mon idée était d'avoir une seule page nolinks, juste avec la définition du bloc vide . Alors tous vos modèles sans liens pourraient «étendre nolinks» au lieu d'étendre 'framework'. Si vous trouvez que vous doublez le nombre de modèles pour ce faire, essayez plutôt de passer une variable au modèle et utilisez quelque chose comme '{% if dontshowlinks%} {% block hyperliens%} {% endblock%} {% endif%}' . –

+0

Je ne pense pas que vous puissiez faire des étiquettes de bloc conditionnelles. C'était mon problème original. J'ai fini par passer une variable et inclure les menus ou pas en fonction de la résolution de ce conditionnel. –

Questions connexes