2010-08-19 5 views
0

J'ai quelques pages telles que l'accord d'utilisateur que je veux apparaître avec ou sans la mise en page (extends tag) selon la façon dont il est appelé. J'utilise jQuery Fancybox pour charger ces pages dans les iframes. Si JS est désactivé, les liens devraient s'ouvrir dans une nouvelle fenêtre avec la mise en page complète, sinon, s'ils sont dans un iframe, ils n'ont pas besoin de la mise en page.Comment obtenir une version sans mise en page d'une page?

A partir de maintenant, je fais en utilisant jQuery pour dépouiller l'en-tête/pied de page (en remplaçant le corps avec juste la partie de contenu)

if(window.location != window.parent.location) { 
    $('body').html($('#content')); 
} 

Mais il ne semble pas le droit de charger des choses qui seront ne jamais être affiché (ou pire, sera affiché pendant une demi-seconde jusqu'à ce que le JS entre). Je suppose que ce que je pourrais faire est de créer un modèle partiel contenant seulement le contenu, et ensuite deux pages de conteneur, une avec l'en-tête/pied de page et une sans; ils comprennent tous deux le partiel. Ensuite, utilisez JS pour modifier le lien ... qui devrait pointer vers des vues différentes, ce qui à son tour appeler les différents modèles ... semble être un énorme travail. Il doit y avoir un meilleur moyen?


@ZeissS:

Quelque chose comme ceci est pas possible dans Django:

{% if not iframe %} 
    {% extends "layouts/default.html" %} 
{% endif %} 

La balise doit{% extends %} être la première balise dans le modèle, donc il ne peut pas être conditionnellement commenté. Je suppose que peut-être je pourrais le faire dans la mise en page elle-même ... et alors il s'appliquerait à toutes mes pages .... essayons cela.

+2

(je ne sais pas django) Restez avec la vue unique, mais déplacez les en-têtes/pieds de page à l'extérieur et faites un 'if' autour de l'inclusion, où vous vérifiez un paramètre de requête. Vous ne devriez pas avoir besoin de créer plusieurs vues/temples. – ZeissS

Répondre

1

En utilisant la réponse de Bryan et Mark comme base, vous pouvez écrire votre propre contexte processeur: http://docs.djangoproject.com/en/1.2/ref/templates/api/#writing-your-own-context-processors

Cela vous permettrait de servir sous condition d'utiliser si des déclarations dans vos modèles.

Probablement le plus élégant, car vous pouvez toujours utiliser l'emballage au besoin.

Vous pouvez combiner ceci avec votre propre balise de modèle, qui vous offre une fonctionnalité étendue, mais conditionnelle basée sur une variable fournie. (Vous ne savez pas si vous pouvez répliquer les fonctionnalités étendues).

http://docs.djangoproject.com/en/1.2/howto/custom-template-tags/#writing-custom-template-tags

L'autre option consiste à utiliser la balise de django {% include %}, et vous pouvez conclure que l'utilisation si des déclarations.

+0

J'ai déjà essayé de répliquer la fonctionnalité étendue en raison d'un autre problème que j'avais. Ce n'est pas facile. Utiliser un processeur de contexte fonctionnerait bien aussi. – mpen

+0

Ouais, je ne suis pas surpris. Extends serait plutôt unique. Cependant en regardant simplement le code étendues, il semble que s'étend prend une variable. Donc, vous pouvez conditionnellement changer cette variable et s'étendre d'un modèle minimal, ou d'un modèle complet? –

+0

Je ne suis même pas sûr que l'extension conditionnelle résoudrait le problème ... en fait, je suis sûr que ce ne serait pas le cas. Eh bien, à moins que je choisisse conditionnellement un modèle * différent * pour étendre. Mais je veux vraiment tous les trucs '' de la mise en page, mais pas l'en-tête et le pied de page. J'ai demandé une discussion sur l'extension du noeud extends ici: http://stackoverflow.com/questions/3209715/how-to-make-a-template-extend-another-one/3385098#3385098 si vous êtes intéressé – mpen

1

Vous pouvez toujours passer un paramètre GET et charger un modèle différent ou modifier le modèle lui-même.

Pour une URL comme example.com/some/view/?show_simple=yes:

show_simple = request.GET.get('show_simple', False) 

if show_simple: 
    # return minimal template 
# return regular template 
+0

Je ne suis pas vraiment sûr de ce que 'request.GET.get ('show_simple', False)' retourne si 'show_simple' n'a pas de valeur ... mais cela devrait être vrai. Ainsi, je pense que "show_simple" dans request.GET' fonctionnerait mieux. Vous êtes proche d'une solution, mais votre réponse nécessite encore deux modèles différents ... il vaut mieux passer le paramètre 'show_simple' au modèle et y faire la logique. – mpen

0

Modifier votre disposition pour conditionnellement le pied de page d'en-tête ...

{% if not iframe %} 
    <div id="header"> 
     ... 
    </div> 
    {% endif %} 

Et puis juste passez le {'iframe':'iframe' in request.GET} dans votre modèle. Voila! Pas aussi mauvais que je pensais que ce serait.

Questions connexes