2010-08-19 1 views
0

У меня есть некоторые страницы, такие как пользовательское соглашение, которое я хочу показывать с макетом или без него (extends) в зависимости от того, как он называется. Я использую jQuery Fancybox для загрузки этих страниц в iframe. Если JS отключен, ссылки должны открываться в новом окне с полным макетом, иначе, если они находятся в iframe, они не нуждаются в макете.Как получить версию без макета страницы?

В настоящее время, я делаю с помощью JQuery, чтобы вырезать верхний/нижний колонтитул (заменяющий тело только часть содержимого)

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

Но это не кажется правильным, чтобы загрузить вещи, которые будут никогда не будет отображаться (или, что еще хуже, будет отображаться в течение полутора секунд, пока JS не запустится). Я предполагаю, что я мог бы сделать, это создать частичный шаблон, содержащий только контент, а затем две страницы контейнера, одну с верхним и нижним колонтитулами и одну без; они оба включают в себя частичное. Затем используйте JS для изменения ссылки ... которая должна была бы указывать на разные виды, которые в свою очередь вызывали бы разные шаблоны ... кажется, это ужасно много работы. Должен быть лучший способ?


@ZeissS:

Нечто подобное не возможно в Django:

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

{% extends %} тег должен быть первым тегом в шаблоне, таким образом, она не может быть условно прокомментировал. Возможно, я мог бы сделать это в самой компоновке ... и тогда это применимо ко всем моим страницам ... давайте попробуем это.

+2

(я не знаю django) Оставайтесь с одним видом, но перемещайте верхние и нижние колонтитулы снаружи и делайте 'if' вокруг включения, где вы проверяете параметр запроса. Вам не нужно создавать несколько видов/храмов. – ZeissS

ответ

1

Используя ответ Брайана и Марка в качестве основы вы можете написать свой собственный контекст-процессор: http://docs.djangoproject.com/en/1.2/ref/templates/api/#writing-your-own-context-processors

Это позволит вам условно обслуживать с помощью если заявления в шаблонах.

Возможно, самый элегантный, поскольку по мере необходимости вы можете использовать обертку.

Вы можете комбинировать это со своим собственным тегом шаблона, который предоставляет вам расширенную функциональность, но условно основанную на предоставленной переменной. (Не уверен, что вы можете повторить расширение возможностей).

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

Другой вариант заключается в использовании {% include %} тег Джанго, и вы можете обернуть, что с помощью если заявления.

+0

Я уже пробовал реплицировать функциональность extends из-за другого вопроса, который у меня был. Это не легко. Использование контекстного процессора тоже будет работать. – mpen

+0

Да, я не удивлен. Расширения были бы весьма уникальными. Однако, просто глядя на код расширения, кажется, что extends принимает переменную. Таким образом, вы можете условно изменить эту переменную и перейти от минимального шаблона или к полнофункциональному? –

+0

Я даже не уверен, что условное расширение решит проблему ... на самом деле, я уверен, что это не так. Ну, если я не выбрал * другой * шаблон для расширения. Но на самом деле я действительно хочу, чтобы все элементы '' располагались в макете, а не в верхнем и нижнем колонтитуле. Я предложил некоторое обсуждение расширения узла extends здесь: http://stackoverflow.com/questions/3209715/how-to-make-a-template-extend-another-one/3385098#3385098, если он заинтересован – mpen

1

Вы всегда можете передать параметр GET и загрузить другой шаблон или изменить сам шаблон.

Для некоторых URL как 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

Я не совсем уверен, что 'request.GET.get ('show_simple', False)' возвращает, если 'show_simple' на самом деле не задано значение ... но это должно быть правдой. Таким образом, я думаю, '' show_simple 'в request.GET' будет работать лучше. Вы близки к решению, но ваш ответ по-прежнему требует двух разных шаблонов ... лучше передать 'show_simple' в шаблон и сделать там логику. – mpen

0

Modify макет условно включать колонтитулы ...

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

А потом просто пройти {'iframe':'iframe' in request.GET} в свой шаблон. Вуаля! Не так плохо, как я думал.