2010-03-09 49 views
0

我有一个网站在django中运行,并且希望在第三方网站上提供它。django - 更改iframe中的内容

在这些网站中,他们通过标记使我的内容可用。

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

这样做的最好方法是什么?

有没有什么办法知道请求是由iframe做出的?

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

谢谢!

PS:对不起我的英文不好:/

编辑

好吧,我知道了。但我有另一个问题:

1-我如何告诉我的页面链接(一个href)追加“第三方”sufix?最好将我所有的链接都改为“相对”路径?

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

谢谢!

回答

2

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

这两个URL都会映射到相同的django视图,但传递一个不同的参数,指示您希望模板的完整版本用于视图,还是一个没有页眉,页脚和第三方模板的其他部分的受限制的参数没有兴趣

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

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

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

希望有所帮助。

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


编辑:

建议在计算器上使用:如果你希望有人来阐述自己的答案,添加评论,他们的答案。这将使StackOverflow在页面顶部的小电子邮件图标中记下用户应该检查的答案。我只注意到您对该问题的编辑,因为我正在检查我的回复中的拼写错误。 :-)编辑的问题应该澄清问题,当然,但总是认为如果澄清是通用的,或者如果它是一个答案的评论 - 有时你需要做的两个!澄清你的问题,并在回答中添加评论以提醒受访者这一变化。

回到手头上的问题:

urls.py应该是这个样子:

from django.conf.urls.defaults import * 

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

因此,捕获并送至视图可调用的参数之一(即我想象力称为view_callable)是“模板”,指示要使用的模板。

现在你有两个选择:

一)建立使用继承两个模板 - 这样一个没有页眉/页脚,第二个,从第一个继承,添加必要的额外的方向 - 有观点决定哪些模板要根据urls.py的模板参数进行渲染。通过这种机制,每个模板都知道在其构建的URL中添加适当的模板类型。因此,包含标题的模板将构建将“完整”或“inapp”指示器作为“模板”参数传递给urls.py的网址。

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

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

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调用和动态建立联系。

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

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

记住,可能有其他的方式来做到这一点。这只是我想到的方式。

+0

的感谢!我只需要了解动态链接。 这是我的例子: (r'^/rank/$','foo.views.rank'), (r'^(?P \ w +)/ rank/$','foo.views。排名'), 在我看来,'排名'只有一个模板。 里面,我怎么能改变我的链接使用(或不)前缀'group_name'? 这就好像当用户访问'/ foo/rank /'时,所有链接都可以使用sufix'/ foo /'。 我不能得到如何用{%url%}做到这一点。 – fabriciols 2010-03-09 19:59:51

+1

那么,你不应该在模板中不使用url标记的情况下创建链接。如果您使用url标记,则可以将SUFFIX作为参数传递给方法。阅读更多关于url()的信息:http://docs.djangoproject.com/en/dev/ref/templates/builtins/#ttag-url – cethegeek 2010-03-10 15:29:13

1

对于使用不同URL的情况(例如,当使用lightbox在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>