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

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,按以下方式设置表格的循环渲染:

  1. 先创建表格表头,比如:样本名称、样本类型、硬件版本、软件版本、配置状态、数量、样本编号
  2. 在表头下方新增一行作为数据行,给整行添加循环标签,并在对应单元格填写变量:
    • 选中数据行的段落开头,插入{% 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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.12 15:15:36