django - 更改iframe内的内容

时间:2010-03-09 03:18:42

标签: django

我有一个在django中运行的网站,并希望在第三方网站上提供。

在这些网站中,他们通过标记提供我的内容。

当我在iframe中请求我的网站时,我想修改内容(删除标题,过滤数据等)。

最好的方法是什么?

有没有办法知道请求是从iframe发出的?

Multiples网站会请求相同的网址,我可以根据请求网站更改内容吗?

谢谢!

PS:抱歉我的英文不好:/

修改

好的,我明白了。但我有另外一个问题:

1-如何告诉我的页面链接(a href)附加“thirdparty”sufix?最好将我的所有链接更改为“相对”路径?

2-我希望某些页面只需要全局更改(删除页眉/页脚),而其他页面需要特殊内容。有办法在我的上下文处理器中执行此操作吗?

谢谢!

2 个答案:

答案 0 :(得分:2)

您可以做的一件事是有两个映射的URL:一个供第三方使用,另一个供独立的Django站点使用。

这两个网址都会映射到相同的django视图,但会传递一个不同的参数,表明您希望视图的完整版本模板或受限制的模板没有页眉,页脚和模板的其他部分,第三方不会感兴趣的。

使用模板inheritance或组合(有些人会嘲笑使用include tag,但我总是提到它,因为它是一个选项)来创建适当的模板 - 一个包含您所有组件的模板 - 独立的django网站和仅有第三方内容感兴趣的网站;并根据映射网址传入的参数使您的视图使用其中一个。

因此,第三方会使用http://blah.com/thirdparty/abc/12之类的网址,其中/thirdparty/abc是第三方的网址;而您的主django网站将使用http://blah.com/abc/12,其中/abc是独立网站的网址。您可以同时映射到同一视图,并使用extra-options将参数传递给视图,指示要使用的模板。

我认为通过确定请求来自何处来尝试解决问题是一个失败的主张。

希望有所帮助。

PS。你的英语完全可以理解。


编辑:

建议使用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)使用继承构建两个模板 - 因此一个没有页眉/页脚,第二个继承自第一个,添加必要的附加内容 - 并让视图根据来自{{的模板参数决定呈现哪个模板1}}。使用此机制,每个模板都知道在它构建的URL中添加适当的模板类型。因此,包含标题的模板会构建将“完整”或“inapp”指示符作为“模板”参数传递给urls.py的网址。

b)使用合成构建一个模板 - 因此模板有条件地包括页眉和页脚,具体取决于从视图传入的参数,而参数又决定根据urls.py中的模板参数设置参数。使用此机制,模板知道通过查看视图设置的参数在其构建的URL中添加适当的模板类型。

a)的优点是您可以为独立模板和第三方模板构建完全不同的外观。此外,如果您要使用两个模板,则每个视图中两个网址中的urls.py可能会有利;像:

urls.py

这样,您就可以在视图中进行reverse()次调用,在模板中进行url次调用,并动态构建链接。

b)的优点是您只需要维护一个模板。没有更新一个而忘记另一个的风险。

要回答你的第二个子问题,我想我需要一个例子来理解你的意思......

请注意,可能还有其他方法可以做到这一点。这就是我想到的方式。

答案 1 :(得分:2)

对于使用不同网址不是一个选项的情况,我可能有另一种选择(例如,当使用灯箱在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>