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

模板中数据展示与二维码生成问题:qr_data无值显示如何解决?

Hey there! Let's work through your questions one by one to get everything working for you:

1. 如何在模板中展示数据?

在Django模板里,展示数据最常用的方式就是使用双大括号语法 {{ variable_name }}。如果是模型对象的属性,就用{{ object.attribute }}来访问。

举几个常见场景的例子:

  • 展示单个对象的属性:
    <!-- 假设视图传递了名为`product`的模型实例 -->
    <p>产品名称:{{ product.name }}</p>
    <p>产品价格:{{ product.price }}</p>
    
  • 循环展示列表数据:
    <!-- 假设视图传递了名为`product_list`的查询集 -->
    {% for product in product_list %}
      <div>
        <h3>{{ product.id }} - {{ product.name }}</h3>
        <p>价格:{{ product.price }}</p>
      </div>
    {% endfor %}
    

需要注意的是,所有要在模板中展示的数据,都需要先在视图函数里添加到模板上下文(也就是render方法的第三个参数)中,模板才能访问到。

2. 解决qr_data无值、二维码无法生成的问题

你在admin.py中定义的qr_data方法是Django Admin专属的方法,前端模板默认是无法直接访问到它的。要在前端模板中生成包含对应数据的二维码,我们需要调整一下实现方式:

步骤1:在模型中定义通用的方法

把生成二维码内容的逻辑移到模型类里,这样无论是Admin还是前端模板都能调用:

# models.py
from django.db import models
from django.utils.text import format_lazy

class YourModel(models.Model):
    # 你的模型字段(示例)
    id = models.AutoField(primary_key=True)
    size = models.CharField(max_length=50)
    producer = models.CharField(max_length=100)
    tested_by = models.CharField(max_length=100)
    test_date = models.DateField()

    def get_qr_content(self):
        # 返回纯文本内容(二维码扫描后会显示清晰的文本,而非HTML)
        return format_lazy(
            "ID: {}\nSize: {}\nProducer: {}\nPacked by: {}\nPacked date: {}",
            self.id, self.size, self.producer, self.tested_by, self.test_date
        )

步骤2:在视图中传递模型实例到模板

确保视图把需要的模型对象传到模板上下文:

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

def detail_view(request, obj_id):
    target_obj = YourModel.objects.get(pk=obj_id)
    return render(request, "your_template.html", {"obj": target_obj})

步骤3:在模板中调用方法并生成二维码

加载二维码标签库后,调用模型方法获取内容,再生成二维码:

{% load qr_tags %} <!-- 确保你已安装并加载了二维码标签库 -->

{% with qr_text=obj.get_qr_content %}
    {% qr_from_text qr_text size="S" %}
{% endwith %}

如果还是希望二维码包含HTML格式的内容,只需把模型方法里的format_lazy换成format_html即可,但扫描二维码时会显示HTML代码,一般不推荐这种做法。

3. 如何在模板中一次性展示多个变量值?

有几种便捷的方式可以实现:

  • 直接拼接展示(适合简单场景):

    <p>
      ID: {{ obj.id }} | 尺寸: {{ obj.size }} | 生产商: {{ obj.producer }}<br>
      包装人: {{ obj.tested_by }} | 包装日期: {{ obj.test_date }}
    </p>
    
  • 使用{% with %}标签封装(适合需要重复使用的组合内容):

    {% with full_info="ID: "|add:obj.id|stringformat:"s"|add:" | 尺寸: "|add:obj.size|add:" | 生产商: "|add:obj.producer %}
      <p>{{ full_info }}</p>
      <!-- 后续可以重复使用{{ full_info }} -->
    {% endwith %}
    
  • 在模型中定义组合方法(最优雅的方式,逻辑集中在模型层):
    像前面的get_qr_content一样,在模型里添加一个返回组合内容的方法:

    # models.py
    def get_full_display_info(self):
        return f"ID: {self.id}, 尺寸: {self.size}, 生产商: {self.producer}, 包装人: {self.tested_by}, 包装日期: {self.test_date}"
    

    然后在模板中直接调用:

    <p>{{ obj.get_full_display_info }}</p>
    

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.20 12:13:20