代码之家  ›  专栏  ›  技术社区  ›  binadam

get\u FOO\u等价于ChoiceBlock的显示

  •  1
  • binadam  · 技术社区  · 7 年前

    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 }}
    
    1 回复  |  直到 7 年前
        1
  •  0
  •   gasman    7 年前

    不幸的是,没有一个直接的等价物-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)
      
    • 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' #}