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

如何在Django模板中按名称访问dataclass属性?

问题:Django模板中无法按名称访问dataclass属性

我在Django中用dataclass标准化传递数据:

# models.py
class Person(models.Model):
    name = CharField(max_length=50)

# utils.py
from dataclasses import dataclass

@dataclass
class Performance:
    person: Person
    last_year: int
    five_years: int

视图层代码如下:

# views.py
class IndexView(View):
    def get(self, request):
        persons = Person.objects.filter(name="pam")
        perfs_array = []

        for person in persons:
            p = Performance()
            p.last_year = # 计算逻辑
            p.five_years = # 计算逻辑
            perfs_array.append(p)
        
        context = {"perfs": perfs_array}
        return render(request, 'index.html', context)

预期在模板中按名称访问属性:

<!-- index.html -->
{% for perf in perfs %}
  <h1>{{ perf.person.name }}</h1>
  <p>去年业绩:{{ perf.last_year }}</p>
{% endfor %}

但实际只能通过数字索引访问:

<!-- index.html -->
{% for perf in perfs %}
  <h1>{{ perf.0.name }}</h1>
  <p>去年业绩:{{ perf.1 }}</p>
{% endfor %}

这让代码编写和调试变得麻烦,请问有没有办法按名称访问这些数据?


解决方案

问题出在dataclass的初始化方式上,以下是具体修复方法:

  • 核心原因:你定义的Performance是带必填字段的dataclass,但用Performance()无参实例化时,没有正确初始化字段,导致它退化成了元组结构,所以Django模板只能通过索引访问。另外你还漏给person字段赋值,也不符合dataclass的使用规范。

  • 修复方案1:正确传参实例化dataclass
    直接在实例化时传入所有必填字段的值,包括person:

    # views.py 循环部分修改
    for person in persons:
        last_year_val = # 你的计算逻辑
        five_years_val = # 你的计算逻辑
        # 一次性传入所有字段
        p = Performance(person=person, last_year=last_year_val, five_years=five_years_val)
        perfs_array.append(p)
    
  • 修复方案2:给dataclass字段设置默认值
    如果允许部分字段为空,可以给dataclass字段加默认值,这样无参实例化后也能保持属性可访问:

    # utils.py 修改dataclass定义
    @dataclass
    class Performance:
        person: Person | None = None
        last_year: int = 0
        five_years: int = 0
    

    然后视图中正常赋值即可:

    for person in persons:
        p = Performance()
        p.person = person
        p.last_year = # 计算逻辑
        p.five_years = # 计算逻辑
        perfs_array.append(p)
    
  • 额外修正:模板里的{{ p.last_year }}是笔误,循环变量是perf,要改成{{ perf.last_year }}。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.23 13:27:18