在另一个页面中呈现 cms 页面
Posted
技术标签:
【中文标题】在另一个页面中呈现 cms 页面【英文标题】:render cms page within another page 【发布时间】:2011-09-20 15:36:55 【问题描述】:我正在尝试使用自定义 cms 插件。 这是我的插件类:
class PageInDiv(CMSPlugin):
page_div = models.ForeignKey(Page, verbose_name= "page")
def __unicode__(self):
return self.page_div.get_title()
正如你所看到的,它所做的只是将插件链接到一个页面,然后在我的 cms_plugins.py 上
class PageInDivPlugin(CMSPluginBase):
model = PageInDiv
name = _("Page in div")
render_template = "page.html"
admin_preview = False
def render(self, context, instance, placeholder):
temp = loader.get_template(instance.page_div.get_template())
html = temp.render(context)
context.update(
'html': html,
'title':instance.page_div.get_title(),
'placeholder':placeholder,
)
return context
如您所见,我将所提供页面的 html 传递给插件模板,然后插件模板在托管插件的页面中呈现。 我遇到的问题是通过外键选择的页面中的占位符内容没有被呈现(显示)。 所以我的问题是,有没有办法以编程方式呈现页面占位符?
【问题讨论】:
【参考方案1】:暂时忽略创建自定义插件以执行您所描述的操作(即,以编程方式呈现页面的占位符)的想法,以下可能是一个可行的替代方案,具体取决于您想要实现的目标。 ..
您应该能够在您的“外部”cms 页面(即您要在其中显示另一个 cms 页面内容的页面)的模板中访问当前页面,如下所示:
request.current_page
这是凭借 cms 页面中间件。因此,更进一步,您应该能够像这样访问页面的占位符:
% for placeholder in request.current_page.placeholders %
placeholder.render
% endfor %
这是您可以将页面的占位符呈现在另一个页面“内部”的一种方式。
【讨论】:
嗯,直到今天我还不知道 request.current_page.placeholders :D,谢谢。 不需要 request.current_page.placeholders.all 吗?【参考方案2】:我需要从模板中渲染另一个页面,这可以通过以下方式完成:
@register.simple_tag(takes_context=True)
def render_page(context, page, default="base.html"):
if not page:
return loader.get_template(default).render(context)
new_context = copy(context)
new_context['request'] = copy(context['request'])
new_context['request'].current_page = page
new_context['current_page'] = page
new_context['has_change_permissions'] = page.has_change_permission(context['request'])
new_context['has_view_permissions'] = page.has_view_permission(context['request'])
if not new_context['has_view_permissions']:
return loader.get_template(default).render(context)
return loader.get_template(page.get_template()).render(new_context)
【讨论】:
以上是关于在另一个页面中呈现 cms 页面的主要内容,如果未能解决你的问题,请参考以下文章
如何在 OctoberCMS 中使用控制器的默认主题和变量呈现 cms 页面?
我可以告诉我的浏览器呈现一个页面,就好像我在另一个语言环境中一样?
使用 Kentico Kontent 的对象数组未按 CMS 中设置的顺序呈现