如何在Django自定义模板标签中获取当前模型实例
Django自定义模板标签获取当前模型实例实现方案
问题原因
直接通过模型类Product访问product_description拿到DeferredAttribute是正常现象:该对象是Django模型字段的类级描述符,仅当访问已实例化的模型对象的同名字段时,才会返回实际存储的业务数据,类本身没有绑定具体数据行,自然无法拿到目标值。
模板标签不会自动感知当前渲染上下文中的模型实例,必须通过显式传参的方式传入实例,这是官方推荐的低耦合实现方式。
正确实现步骤
- 修改模板标签定义,增加实例入参
模板标签文件templatetags/description_tag.py代码如下:
from django import template register = template.Library() @register.simple_tag(name='description_tag') def description_tag(product): # 从传入的模型实例上读取目标字段值 return product.product_description
- 模板调用时传入当前模型实例
- 单实例渲染场景:假设视图向模板上下文传入的Product实例变量名为
product,模板中调用写法:
{% load description_tag %} <!-- 页面其他内容 --> <div class="product-desc"> {% description_tag product %} </div>
- 列表循环渲染场景:遍历产品列表时直接传入循环临时变量即可:
{% load description_tag %} <div class="product-list"> {% for product in page_products %} <div class="product-card"> <h4>{{ product.title }}</h4> {% description_tag product %} </div> {% endfor %} </div>
非推荐写法(仅作参考)
如果不想手动传参,可以给标签开启takes_context参数,直接从模板上下文中读取固定名称的实例,但该写法耦合度极高,一旦上下文中的变量名修改就会直接失效:
@register.simple_tag(name='description_tag', takes_context=True) def description_tag(context): # 硬编码读取上下文中名为product的变量 product = context.get('product') return product.product_description if product else ''
内容的提问来源于stack exchange,提问作者MagicHat
相关产品推荐
相关产品推荐

