模板中数据展示与二维码生成问题:qr_data无值显示如何解决?
Hey there! Let's work through your questions one by one to get everything working for you:
在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方法的第三个参数)中,模板才能访问到。
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代码,一般不推荐这种做法。
有几种便捷的方式可以实现:
直接拼接展示(适合简单场景):
<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

