You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Django模板中如何实现类似vars()函数打印Item对象属性

在Django模板中直接打印Item对象的属性

嘿,我明白你的需求了——你在Django模板里传入了Item对象,现在想直接打印它的属性(就像用vars()函数那样),但因为你重写了__str__方法,直接输出对象只会显示那个链式的字符串,对吧?我给你几个实用的解决办法:

方法一:给Item类添加属性获取方法

直接在你的Item类里加一个方法,专门返回对象的属性字典,这样在模板里就能直接调用了:

class Item:
    value = ''
    previous_item = None  # 这里注意原代码里previous_item = Item会导致初始化报错,改成None更合理

    def __str__(self):
        # 优化链的展示,处理终点情况
        if self.previous_item:
            return f'{self.value} > {self.previous_item}'
        return self.value

    def get_attributes(self):
        # 过滤掉下划线开头的私有属性,返回可展示的属性字典
        return {key: value for key, value in vars(self).items() if not key.startswith('_')}

然后在模板里循环打印属性:

{% for attr_name, attr_value in item.get_attributes.items %}
    <p><strong>{{ attr_name }}:</strong> {{ attr_value }}</p>
{% endfor %}

如果你想包含所有属性(包括私有属性),直接返回vars(self)就行。

方法二:自定义模板过滤器(更通用)

如果不想修改Item类,或者需要给多个类实现这个功能,自定义模板过滤器是更好的选择:

  1. 在你的Django应用下创建templatetags目录(如果没有的话),然后新建custom_filters.py文件:
from django import template

register = template.Library()

@register.filter(name='get_attrs')
def get_object_attributes(obj):
    # 过滤私有属性,按需调整规则
    return {key: value for key, value in vars(obj).items() if not key.startswith('_')}
  1. 在模板里先加载过滤器,再使用:
{% load custom_filters %}

{% for attr_name, attr_value in item|get_attrs.items %}
    <p><strong>{{ attr_name }}:</strong> {{ attr_value }}</p>
{% endfor %}

额外注意:类属性的获取

如果你的Item里的属性是类属性(比如你写的value = ''),vars()只能拿到实例属性,这时候可以修改方法来同时获取类属性:

def get_attributes(self):
    attrs = {}
    # 获取类属性(排除方法和私有属性)
    for key, value in self.__class__.__dict__.items():
        if not key.startswith('_') and not callable(value):
            attrs[key] = value
    # 更新实例属性
    attrs.update({key: value for key, value in vars(self).items() if not key.startswith('_')})
    return attrs

这样就能完美实现你想要的、类似vars()的属性打印效果啦~

内容的提问来源于stack exchange,提问作者Nebulosar

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.21 08:12:50