如何在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
相关产品推荐
相关产品推荐

