2011-06-22 53 views
1

我試圖渲染一個cms頁面,在另一個頁面內使用自定義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選擇的頁面中的佔位符內容未呈現(顯示)。 所以我的問題是,有沒有辦法以編程方式呈現頁面佔位符?

回答

2

只是暫時忽略了創建自定義插件以實現所描述的內容(即以編程方式呈現頁面佔位符)的想法,以下內容可能是一種可行的替代方法,具體取決於您嘗試實現的目標...

您應該可以在模板中找到您的「外部」cms頁面(即您希望顯示另一個cms頁面內容的頁面),以便像訪問當前頁面一樣這個:

{{ request.current_page }} 

這是憑藉cms頁面中間件。因此,採取更進了一步,你應該能夠訪問該頁面的佔位符這樣的:

{% for placeholder in request.current_page.placeholders %} 
    {{ placeholder.render }} 
{% endfor %} 

這是你能去渲染另一個頁面「內部」頁面的佔位符的一種方式。

+0

嗯,到今天我還沒有收到有關的request.current_page.placeholders想法:d,謝謝。 – Paulo

+0

是不是需要request.current_page.placeholders.all? – daigorocub

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)