我尝试使用自定义cms插件在另一个页面内渲染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传递给插件模板,然后插件模板在托管插件的页面中呈现。 我遇到的问题是没有呈现(显示)通过foreignkey选择的页面中的占位符内容。 所以我的问题是,有没有办法以编程方式呈现页面占位符?
答案 0 :(得分:2)
暂时忽略创建自定义插件以实现您所描述的内容(即以编程方式呈现页面占位符)的想法,以下可能是一个可行的替代方案,具体取决于您要实现的目标。 ..
您应该能够,只需在“外部”cms页面的模板中(即,您要在其中显示另一个cms页面内容的页面),就可以访问当前页面,如下所示:
{{ request.current_page }}
这是凭借cms页面中间件。所以更进一步,您应该能够访问页面的占位符,如下所示:
{% for placeholder in request.current_page.placeholders %}
{{ placeholder.render }}
{% endfor %}
这是你可以将页面的占位符“放在”另一页面内的一种方式。
答案 1 :(得分:0)
我需要在模板中渲染另一个页面,可以通过以下方式完成:
@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)