【问题标题】:How can I evaluate a View context variable as a Template variable in Django?如何在 Django 中将视图上下文变量评估为模板变量?
【发布时间】:2016-12-29 23:09:12
【问题描述】:

我想将视图中的上下文变量传递到我的模板中,以指示模板应显示的内容。

我有一个上下文列表变量column_headers,它指示列表页表中的列数,以及应该使用的标题文本。

context['column_list'] = [
    _('Animal'),
    _('Owner'),
    _('Reason'),
    _('Time'),
    _('Vet'),
    _('Status')
]

我想包含一个相关的列表变量,它告诉模板为相应列中的每个单元格包含哪个变量,例如:

context['cell_vars'] = [
    'patient',
    'client',
    'reason',
    'start_time',
    'attending_staff',
    'status'
]

这样变量FOO.client 将出现在'Owner' 列中,FOO.attending_staff 将出现在'Vet' 列中,等等。

这样做可以让我有一个 list.html 页面来处理我的所有列表。

所以,我的问题是这是否是一个好主意,如果是,我将如何评估作为上下文变量呈现的“字符串”,即

{% for row in rows %} #loop over list data
    {{ row.attending_staff }} #work fine, but...
    {{ row.SOME_VARIABLE_THAT_HAS_VALUE_OF_'attending_staff' }} #doesn't
{% endfor %}

所以,如果 x='attending_staff' 我需要能够评估变量 row.x 以便它实际评估 row.attending_staff

这个用例非常明确,只涉及显示逻辑(不是数据检索,因为数据已经在循环变量row 中),因此 IMO 可能非常适合模板。

它将允许我拥有一个“list.hml”模板来处理我几乎所有的列表,而不是我目前拥有的 10 个 foo_list.html 页面,所有页面都非常相似(表结构、循环逻辑、图标、链接、css 类名等)。

【问题讨论】:

    标签: python django django-templates django-views


    【解决方案1】:

    我认为custom tags or filters 会是一个解决方案

    例如:以下

    @register.filter
    def settings_value(name):
        return getattr(settings, name, "")
    

    可以在模板中使用

    {% load your_filters %}
    {{ "MY_SETTINGS_NAME"|settings_value }}
    

    【讨论】:

      【解决方案2】:

      您是否尝试过这样做?或者也许你没有选择:

      # Python script
      context['column_list'] = [
          _('Animal'),
          _('Owner'),
          _('Reason'),
          _('Time'),
          _('Vet'),
          _('Status')
      ]
      
      context['cell_vars'] = [
          'patient',
          'client',
          'reason',
          'start_time',
          'attending_staff',
          'status'
      ]
      
      g_context = zip(context['column_list'], context['cell_vars'])
      
      # HTML
      {% for column, var in g_context %}
          {{ column }}
          {{ var }}
      {% endfor %}
      

      这是你要求的吗?

      【讨论】:

        猜你喜欢
        • 2018-07-03
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2023-03-25
        • 1970-01-01
        • 2011-03-04
        • 1970-01-01
        • 2021-10-15
        相关资源
        最近更新 更多