【问题标题】:FeinCMS: Get property of subsequent content block in templateFeinCMS:获取模板中后续内容块的属性
【发布时间】:2014-04-23 10:33:23
【问题描述】:

如何在呈现RichTextContent 的模板中获取有关后续 FeinCMS 内容块的信息?

获得类名之类的东西是理想的,但访问模型的字段也会对我有所帮助。

【问题讨论】:

    标签: django django-templates feincms


    【解决方案1】:

    开箱即用的方式无法提前查看下一个内容块。你到底想完成什么?

    我们经常不得不将多个相同类型的内容块包装在另一个具有特定类的<div> 中。我们通过自定义模板标签(使用django-ttag library)实现了这一点:

    import ttag 
    from feincms.templatetags.feincms_tags import _render_content                             
    
    @register.tag                                                                             
    class CmsRenderRegion(ttag.Tag):                                                          
        '''                                                                                   
        Renders a FeinCMS template region, just like feincms.templatetags.feincms_tags.render_region.
        However, it checks each content type for a field "wrapper_css_classes". If the content type
        has such a class, it adds a surrounding <div class="{{ wrapper_css_classes }}"> to all sequential 
        content types with that class.                                                        
        '''                                                                                   
        page = ttag.Arg()                                                                     
        region = ttag.Arg()                                                                   
        request = ttag.Arg()                                                                  
    
        def render(self, context):                                                            
            data = self.resolve(context)                                                      
    
            s = u''                                                                           
            last_wrapper = None                                                               
            for content in getattr(data['page'].content, data['region']):                     
                 current_wrapper = getattr(content, 'wrapper_css_tag', None)                   
                if current_wrapper is None:                                                   
                    if last_wrapper is not None:                                              
                        # close the previous wrapper                                          
                        s += u'</%s>' % last_wrapper[0]                                       
                else:                                                                         
                    if last_wrapper is None:                                                  
                        s += u'<%s class="%s">' % current_wrapper                             
                    elif last_wrapper != current_wrapper:                                     
                        s += u'</%s><%s class="%s">' % (                                      
                            last_wrapper[0], current_wrapper[0], current_wrapper[1])          
    
                last_wrapper = current_wrapper                                                
                s += _render_content(content, request=data['request'], context=context)       
    
            if last_wrapper is not None:                                                      
                s += u'</%s>' % last_wrapper[0]                                               
    
            return s
    

    在您的模板中,您将使用{% cms_render_region feincms_page 'region' request %} 代替{% feincms_render_region feincms_page 'region' request %} 来渲染该区域。

    您可以使渲染模板的逻辑适应您想要完成的任何任务。内容块在page.content.{{ region }},例如page.content.sidebar

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-05-27
      • 2021-09-03
      • 1970-01-01
      相关资源
      最近更新 更多