在 Django 模板中,想要像 print 一样直观显示变量(包括调试变量类型、内容,或直接输出变量值),有多种方式,核心分为「直接输出变量」「调试级输出(含详细信息)」「特殊场景处理」三类,以下是具体方法:

一、基础:直接输出变量(最常用)

Django 模板的核心语法 {{ 变量名 }} 本质就是「输出变量值」,等价于 Python 里的 print(变量),是最基础的显示方式。

示例:

假设视图传递了变量 product 到模板:

# views.py
from django.shortcuts import render
from .models import Product

def product_detail(request):
    product = Product.objects.first()
    return render(request, 'product_detail.html', {'product': product})

模板中直接显示变量:

<!-- product_detail.html -->
<!-- 1. 显示普通变量 -->
<p>产品名称:{{ product.name }}</p>
<p>产品价格:{{ product.price }}</p>

<!-- 2. 显示链式属性(比如你之前提到的图片 URL) -->
<p>第一张图片 URL:{{ product.images.first.image.url }}</p>

<!-- 3. 显示列表/字典元素 -->
<p>列表第一个元素:{{ my_list.0 }}</p>
<p>字典某个键:{{ my_dict.key_name }}</p>

注意:

  • 如果变量为 None、不存在,或属性/键不存在,模板会静默输出空字符串(不会报错);
  • 如果变量是对象(如 product),直接写 {{ product }} 会输出该对象的 __str__ 方法返回值(需在模型中定义 __str__)。

二、调试级输出(含详细信息,像 print + 调试)

如果需要像 print(repr(变量)) 一样显示变量的详细信息(类型、完整内容、嵌套结构),需借助 Django 内置的调试工具或第三方库。

方法 1:使用 debug 模板标签(内置,需开启调试)

Django 提供 {% debug %} 标签,会输出当前模板上下文的所有变量+详细信息(包括请求对象、视图传递的所有变量),适合全局调试。

步骤:
  1. 确保项目 settings.pyDEBUG = True(仅开发环境用,生产环境必须关闭);
  2. 模板中直接添加标签:

    <!-- 输出所有上下文变量的详细调试信息 -->
    {% debug %}

    输出效果:会以 HTML 表格形式展示所有变量名、类型、完整值,包括嵌套对象的属性,非常适合排查「变量为什么没值」「变量结构是什么」。

方法 2:使用 pprint 过滤器(第三方,更美观)

Django 没有内置「格式化输出」过滤器,但可以自定义一个「仿 Python pprint」的过滤器,实现变量的格式化显示。

步骤:
  1. 在 app 下创建 templatetags 目录(必须,且需包含 __init__.py);
  2. 创建自定义过滤器文件(如 debug_filters.py):

    # templatetags/debug_filters.py
    from django import template
    import pprint
    
    register = template.Library()
    
    @register.filter
    def pprint_var(value):
     """格式化输出变量(仿 pprint)"""
     return pprint.pformat(value)  # 返回格式化的字符串
  3. 模板中使用该过滤器:

    <!-- 先加载自定义过滤器 -->
    {% load debug_filters %}
    
    <!-- 格式化显示变量 -->
    <pre>{{ product|pprint_var }}</pre>
    <pre>{{ product.images.all|pprint_var }}</pre>
  4. pre 标签用于保留换行和空格,让格式化输出更易读;
  5. 效果等价于 Python 中 pprint.pprint(变量)

方法 3:输出变量类型(辅助调试)

如果想确认变量类型(比如判断是 QuerySet 还是单个对象),可自定义过滤器返回类型名:

# templatetags/debug_filters.py
@register.filter
def var_type(value):
    """返回变量的类型名称"""
    return str(type(value))

模板中使用:

{% load debug_filters %}
<p>product 类型:{{ product|var_type }}</p>
<p>images 类型:{{ product.images.all|var_type }}</p>

三、特殊场景处理

1. 显示空/不存在的变量(避免静默为空)

默认情况下,模板中引用不存在的变量会输出空字符串,可通过 default 过滤器指定默认值:

<!-- 如果 product.images.first 不存在,显示「无图片」 -->
<p>图片 URL:{{ product.images.first.image.url|default:"无图片" }}</p>

<!-- 更严谨:先判断变量是否存在 -->
{% if product.images.first %}
    <p>图片 URL:{{ product.images.first.image.url }}</p>
{% else %}
    <p>无图片</p>
{% endif %}

2. 显示 QuerySet 等可迭代对象的所有元素

如果变量是 QuerySet(如 product.images.all),直接 {{ product.images.all }} 会输出对象的 __str__ 列表,可通过循环逐个显示:

<h3>所有图片 URL:</h3>
{% for image in product.images.all %}
    <p>{{ forloop.counter }}: {{ image.image.url }}</p>
{% empty %}
    <p>暂无图片</p>
{% endfor %}

3. 显示请求对象等特殊变量

Django 模板默认可访问 request 对象(需确保 settings.py'django.core.context_processors.request'TEMPLATE_CONTEXT_PROCESSORS 里),可直接输出请求相关信息:

<p>当前 URL:{{ request.path }}</p>
<p>用户:{{ request.user.username }}</p>
<p>GET 参数:{{ request.GET }}</p>

四、总结

需求场景推荐方法适用场景
简单输出变量值{{ 变量名 }}日常显示
全局调试所有变量{% debug %}开发环境排查问题
格式化/详细输出单个变量自定义 pprint_var 过滤器 + <pre>查看复杂对象结构
避免空变量静默输出`{{ 变量default:"默认值" }}{% if %}`处理空值场景

⚠️ 注意:{% debug %} 和自定义调试过滤器仅用于开发环境,生产环境需删除,避免泄露敏感信息;生产环境只需保留 {{ 变量 }} 这类基础输出。
(来自豆包)

标签: none