如何在Django中将View上下文变量评估为Template变量?

时间:2016-08-23 08:13:30

标签: python django django-templates django-views

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

我有一个上下文列表变量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 x foo_list.html页面,它们彼此非常相似(表结构,循环逻辑,图标,链接,css类名等)。 / p>

2 个答案:

答案 0 :(得分:0)

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

例如:以下

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

可以在

等模板中使用
{% load your_filters %}
{{ "MY_SETTINGS_NAME"|settings_value }}

答案 1 :(得分:0)

您是否尝试过这种方式?或者你可能没有选择:

# 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 %}

这是你要求的吗?