django - изменить содержимое внутри iframe - PullRequest
1 голос
/ 09 марта 2010

У меня есть сайт, работающий в django, и я хочу сделать его доступным на сторонних сайтах.

На этих сайтах мой контент доступен через тег.

Когда мой сайт запрашивается из этого iframe, я хотел бы изменить его содержимое (удалить заголовок, отфильтровать данные и т. Д.).

Как лучше всего это сделать?

Есть ли способ узнать, что запрос делается из iframe?

Множественные сайты будут запрашивать один и тот же URL-адрес, могу ли я изменить контент в зависимости от запрашивающего сайта?

Спасибо!

PS: простите за мой плохой английский: /

EDIT

хорошо, я понял. но у меня есть еще вопросы:

1- Как мне указать ссылкам на мою страницу (a href) добавить суффикс "третьего лица"? лучше всего поменять все мои ссылки на "относительные" пути?

2- Я хочу сделать так, чтобы некоторым страницам потребовались только глобальные изменения (удалить верхний / нижний колонтитул), а другим - специальный контент. Есть способ сделать это в моем процессоре контекста?

спасибо!

Ответы [ 2 ]

2 голосов
/ 28 октября 2015

У меня может быть альтернатива для случаев, когда использование разных URL-адресов недоступно (например, при использовании лайтбокса для открытия ссылки в iframe, но при открытии в новой вкладке эта же ссылка имеет измененное содержимое).

Я решил свою проблему, добавив следующий скрипт в шаблон страниц, которые могут быть загружены в iframe:

<script type="text/javascript">
    function inIframe () {
        try {
            return window.self !== window.top;
        } catch (e) {
            return true;
        }
    }
    if(inIframe()) {
        $('header').css('display', 'none');
        $('footer').css('display', 'none');
        // or anything else you may want to do
    }
</script>
2 голосов
/ 09 марта 2010

Одна вещь, которую вы могли бы сделать, это иметь два сопоставленных URL-адреса: один для использования третьими сторонами и один для использования вашим автономным сайтом django.

Оба URL-адреса будут отображаться в одно и то же представление django, но при этом передается другой параметр, указывающий, что вы хотите полную версию шаблона для представления или ограниченную версию без заголовка, нижних колонтитулов и других частей шаблона, которые сторонние организации не будут интересоваться.

Используйте шаблон наследование или композицию (некоторые люди будут лаять при использовании тега include , но я всегда упоминаю об этом, потому что это вариант) для создания соответствующих шаблонов - один со всеми компоненты для вашего автономного сайта django и один только с контентом, который интересует третьи стороны; и ваши представления используют один или другой в соответствии с параметром, переданным в отображенном URL.

Таким образом, третьи стороны будут использовать URL-адрес, такой как http://blah.com/thirdparty/abc/12, где /thirdparty/abc - это URL-адрес для третьих сторон; в то время как ваш основной сайт django будет использовать http://blah.com/abc/12, где /abc - это URL-адрес автономного сайта. Вы можете настроить оба вида на одно и то же представление и использовать extra-options , чтобы передать в представление параметр, указывающий, какой шаблон использовать.

Я думаю, что попытка решить проблему путем определения источника запроса является проигрышным предложением.

Надеюсь, это поможет.

PS. Ваш английский был совершенно понятен.


Edit:

Предложение по использованию StackOverflow: если вы хотите, чтобы кто-то разработал свой ответ, добавьте комментарий к своему ответу. Это пометит StackOverflow на маленьком значке электронной почты в верхней части страницы, что есть ответ, который должен проверить пользователь. Я только заметил, что вы отредактировали вопрос, потому что я проверял орфографическую ошибку в своем ответе. :-) Конечно, необходимо внести изменения в вопрос, чтобы уточнить вопрос, но всегда думайте, является ли пояснение общим или это комментарий к ответу - иногда вам нужно сделать и то, и другое! Уточните свой вопрос и добавьте комментарий к ответу, чтобы предупредить респондента об изменении.

Вернуться к рассматриваемому вопросу:

Ваш urls.py должен выглядеть примерно так:

from django.conf.urls.defaults import *

urlpatterns = patterns('app.views',
    (r'^standalone/(?P<template>\w+)/(\d{4})/$', 'view_callable'),
)

Итак, один из параметров, захваченных и отправленных в вызываемое представление (которое я образно назвал view_callable), является «шаблоном» с указанием шаблона для использования.

Теперь у вас есть два варианта:

a) Создайте два шаблона, используя наследование - так, что у одного нет верхнего / нижнего колонтитула, а второй, наследуя от первого, добавляет необходимые дополнения - и пусть представление решает, какой шаблон отображать на основе параметра шаблона из urls.py. С помощью этого механизма каждый шаблон знает, как добавить правильный тип шаблона в URL-адреса, которые он создает. Таким образом, шаблоны, включая заголовок, будут создавать URL-адреса, передающие индикатор «complete» или «inapp» в качестве параметра «template» для urls.py.

b) Создайте один шаблон с использованием композиции - поэтому шаблон условно включает верхний и нижний колонтитулы в зависимости от параметра, передаваемого из представления, который, в свою очередь, решил установить параметр на основе параметра шаблона из urls.py. С помощью этого механизма шаблон знает, как добавить правильный тип шаблона в URL-адреса, которые он создает, просматривая параметр, установленный представлением.

Преимущество а) в том, что вы можете создавать совершенно разные стили для своих автономных и сторонних шаблонов. Кроме того, если вы работаете с двумя шаблонами, может быть выгодно разбить urls.py на два URL для каждого просмотра; как:

from django.conf.urls.defaults import *

urlpatterns = patterns('app.views',
    (r'^standalone/standalone/(\d{4})/$', 'view_callable', {'template':'complete'}),
    (r'^standalone/thirdparty/(\d{4})/$', 'view_callable', {'template':'thirdparty'}),
)

Это позволит вам выполнять reverse () вызовов в представлениях или url вызовов в шаблонах и динамически создавать ссылки.

Преимущество б) в том, что у вас есть только один шаблон для обслуживания. Нет риска обновить одно и забыть о другом.

Чтобы ответить на ваш второй подвопрос, я думаю, мне нужен пример, чтобы понять, что вы имеете в виду ...

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...