在Django中,如何使用列表项的String值来获取对象的变量值?

时间:2012-01-07 02:18:40

标签: python django

假设是包含字符串的列表,每个字符串代表一个对象 o 的变量。

<tbody>
    {% for o in objects %}
    <tr>
        {% for col in columns %}
        <td>{{ o.col }}</td>
        {% endfor %}
    </tr>
    {% endfor %}
</tbody>

示例:

class Dog(models.Model):
    name = models.CharField()
    age = models.IntegerField()
    is_dead = models.BooleanField()

columns = ('name', 'age')

我无法显式输入对象的变量名,必须将其作为另一个列表传递,因为我正在尝试制作一个“通用”模板。此外,并非所有变量都必须显示给用户。

1 个答案:

答案 0 :(得分:1)

我对django不太熟悉,知道是否有内置的内容,但是......你可以将自己的getattr版本定义为template filter。出于某种原因(我假设因为它是内置函数),我无法简单地将内置函数注册为新的模板过滤器。无论哪种方式,这就是我定义我的版本的方式:

# This is defined in myapp/templatetags/dog_extras.py
from django import template

register = template.Library()

@register.filter
def my_getattr(obj, var):
    return getattr(obj, var)

要使用它,您将像使用其他两个arg模板过滤器一样使用它:

{{ o|my_getattr:col }}

这是一个完整的例子(不要忘记顶部的“load”指令!):

{% load dog_extras %}

<table>
    <tbody>
        {% for o in objects %}
        <tr>
            {% for col in columns %}
            <td>{{ o|my_getattr:col }}</td>
            {% endfor %}
        </tr>
        {% endfor %}
    </tbody>
</table>

如果您之前从未制作过自定义模板过滤器,请务必read the docs!