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

如何在Django自定义模板标签中获取当前模型实例

Django自定义模板标签获取当前模型实例实现方案

问题原因

直接通过模型类Product访问product_description拿到DeferredAttribute是正常现象:该对象是Django模型字段的类级描述符,仅当访问已实例化的模型对象的同名字段时,才会返回实际存储的业务数据,类本身没有绑定具体数据行,自然无法拿到目标值。

模板标签不会自动感知当前渲染上下文中的模型实例,必须通过显式传参的方式传入实例,这是官方推荐的低耦合实现方式。

正确实现步骤

  1. 修改模板标签定义,增加实例入参
    模板标签文件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
  1. 模板调用时传入当前模型实例
  • 单实例渲染场景:假设视图向模板上下文传入的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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.28 18:09:27