Skip to main content
 首页 » 编程设计

python之在 Django 中,如何使用列表项的字符串值来获取对象变量的值

2025年05月04日10youxin

这是假设 columns 是一个包含字符串的列表,每个字符串代表对象 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') 

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

请您参考如下方法:

我对 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 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!