2017-10-06 82 views
0

我有一个块如下:get_FOO_display等效ChoiceBlock

class SomeBlock(blocks.StructBlock): 
    choice = blocks.ChoiceBlock(choices=(('Y', 'Yellow'), ...)) 
    # more fields 

    class Meta: 
     template = 'myapp/blocks/some_block.html' 

在我的模板,我有:

{% load wagtailcore_tags %} 
<div>{{ value.choice }}</div> 

这将显示“Y”如预期,但我怎么得到它显示作为'黄'?

这些变化不工作(得不到任何输出):

{{ value.get_choice_display }} 
{{ value.bound_blocks.get_choice_display }} 

回答

0

不幸的是,不是直接等同 - 鹡鸰的块机制将显示名称为一个细节,那就是具体的编辑形式,而不是数据的一部分,所以在渲染模板时,他们不易访问。我建议安排如下东西:

  • 在自己的模块中定义选择列表,它可以从多个地方导入 - 例如, MYAPP/colors.py:

    COLORS = (('Y', 'Yellow'), ...) 
    COLORS_LOOKUP = dict(COLORS) # gives you a dict of the form {'Y': 'Yellow', ...} 
    
  • 更新ChoiceBlock定义是指在列表中定义有:

    from myapp.colors import COLORS 
    
    class SomeBlock(blocks.StructBlock): 
        choice = blocks.ChoiceBlock(choices=COLORS) 
    
  • 创建一个自定义模板标签从值做查询,显示的名称 - 例如MYAPP/templatetags/color_tags.py:

    from django import template 
    from myapp.colors import COLORS_LOOKUP 
    
    register = template.Library() 
    
    @register.simple_tag 
    def get_color_display_name(name): 
        return COLORS_LOOKUP.get(name) 
    
  • 使用该标签在你的模板:

    {% load color_tags %} 
    ... 
    {% get_color_display_name value.choice %} {# to output it immediately #} 
    {% get_color_display_name value.choice as label %} {# to assign it to the variable 'label' #} 
    
+0

谢谢,模板标签是一个很好的解决方案。 – binadam