Django从数据库取数填充Word模板报错:QuerySet无sample_name属性
问题分析与解决
错误根源
SampleList.objects.all()返回的是QuerySet对象——这是所有SampleList记录的集合,而非单个SampleList实例。你直接调用sample.sample_name相当于给集合类调用单个对象的属性,自然会触发'QuerySet' object has no attribute 'sample_name'错误。
解决方案
要实现长列表填充Word表格,需要配合docx-template的循环语法处理集合数据,具体步骤如下:
1. 修正视图层的数据传递逻辑
修改views.py,将整个样本集合传入上下文,而非尝试直接获取单个属性:
def save_sample_details(request): # 获取所有样本数据,QuerySet本身支持迭代,直接传入上下文即可 samples = SampleList.objects.all() doc = DocxTemplate("lab_management/word/sample_template.docx") context = { 'samples': samples } doc.render(context) doc.save('lab_management/word/sample.docx') return redirect('/lab/sample/details/')
2. 在Word模板中配置表格循环
打开sample_template.docx,按以下方式设置表格的循环渲染:
- 先创建表格表头,比如:样本名称、样本类型、硬件版本、软件版本、配置状态、数量、样本编号
- 在表头下方新增一行作为数据行,给整行添加循环标签,并在对应单元格填写变量:
- 选中数据行的段落开头,插入
{% for sample in samples %} - 每个单元格分别填写:
{{ sample.sample_name }}{{ sample.sample_type }}{{ sample.hardware_version }}{{ sample.software_version }}{{ sample.config_status }}{{ sample.number }}{{ sample.sample_number }}
- 选中数据行的段落结尾,插入
{% endfor %}
- 选中数据行的段落开头,插入
3. 特殊场景:仅处理单个样本
如果你的需求偶尔需要单个样本数据,可将QuerySet替换为单个对象获取:
# 按ID获取单个样本 sample = SampleList.objects.get(id=1) # 或获取第一条记录 sample = SampleList.objects.first()
这种情况下才能直接访问sample.sample_name等单个对象属性,但显然你的需求是长列表填充,优先用集合循环方案。
内容的提问来源于stack exchange,提问作者krisssz
相关产品推荐
相关产品推荐

