get_FOO_display 相当于 ChoiceBlock

get_FOO_display equivalent for 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',但如何让它显示为 'Yellow'?

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

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

不幸的是,没有直接的等效项 - 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' #}