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

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 %}

方案二:自定义模板过滤器

通过自定义过滤器实现模板内动态取属性的功能,适合需要多处复用的场景:

  1. 在你的Django应用下创建templatetags目录,里面新建__init__.py和custom_filters.py文件;
  2. 在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)
  1. 在模板中加载并使用过滤器:
{% load custom_filters %}

{% for devize in queryset %} 
 <td>{{ devize|get_attribute:sl }}</td>
{% endfor %}

两种方案各有优劣:方案一逻辑简单,性能开销小;方案二更灵活,适合多个模板都需要动态取属性的场景。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.31 14:40:44