Django中如何根据URL参数动态访问模型属性?
Django模板中动态访问模型属性的方法
问题说明
我在Django视图中向模板传递了名为sl的URL参数,想了解能否在模板中通过{{ devize.sl{{sl}} }}的方式,动态访问Deviz模型对应的属性。
视图代码
@login_required def slList(request,centrudecost,SL): queryset = Deviz.objects.filter(centrudecost_id=centrudecost) sl = SL print(centrudecost) return render(request, "proiecte/sl_list.html", {"queryset": queryset,"sl":sl})
模板代码
{% for devize in queryset %} <td>{{ devize.sl{{sl}} }}</td> {% endfor %}
解决方案
Django模板不支持这种嵌套变量的写法,要实现动态访问模型属性,有两种可行方案:
方案一:视图中预处理属性值
直接在视图里把每个Deviz对象对应的目标属性值提取出来,添加为对象的临时属性,再传给模板:
@login_required def slList(request,centrudecost,SL): queryset = Deviz.objects.filter(centrudecost_id=centrudecost) sl = SL # 遍历对象,动态获取属性值并存储 for dev in queryset: # getattr第三个参数是属性不存在时的默认值,可根据需求调整 dev.dynamic_sl_value = getattr(dev, sl, None) return render(request, "proiecte/sl_list.html", {"queryset": queryset,"sl":sl})
模板中直接使用预处理好的属性:
{% for devize in queryset %} <td>{{ devize.dynamic_sl_value }}</td> {% endfor %}
方案二:自定义模板过滤器
通过自定义过滤器实现模板内动态取属性的功能,适合需要多处复用的场景:
- 在你的Django应用下创建
templatetags目录,里面新建__init__.py和custom_filters.py文件; - 在
custom_filters.py中编写过滤器代码:
from django import template register = template.Library() @register.filter def get_attribute(obj, attr_name): # 动态获取对象属性,不存在则返回None return getattr(obj, attr_name, None)
- 在模板中加载并使用过滤器:
{% load custom_filters %} {% for devize in queryset %} <td>{{ devize|get_attribute:sl }}</td> {% endfor %}
两种方案各有优劣:方案一逻辑简单,性能开销小;方案二更灵活,适合多个模板都需要动态取属性的场景。
内容的提问来源于stack exchange,提问作者Kertz
相关产品推荐
相关产品推荐

