get_FOO_display相当于ChoiceBlock

时间:2017-10-06 14:31:50

标签: django wagtail wagtail-streamfield

我有一个块如下:

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>

这将显示&#39; Y&#39;正如所料,但如何让它显示为&#39;黄色&#39;?

这些变化不起作用(没有输出):

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

1 个答案:

答案 0 :(得分:0)

不幸的是,没有直接等效 - Wagtail的块机制将显示名称视为特定于编辑表单的细节,而不是数据的一部分,因此他们可以将这些显示名称视为特定于编辑表单的细节。在您渲染模板时无法轻松访问。我建议安排如下事项:

  • 在自己的模块中定义选项列表,可以从多个位置导入 - 例如的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' #}