Django中使用python-docx-template(docxtpl)如何在docx模板中渲染显示图片?
解决方案
错误原因
你当前直接将图片URL字符串传入上下文,模板会默认按照普通文本渲染,python-docx-template需要接收InlineImage类型的对象才能识别为图片内容渲染。
调整步骤
1. 安装依赖
需要先安装requests库用于下载远程图片:
pip install requests
2. 修改视图函数代码
新增远程图片下载逻辑,将图片封装为InlineImage对象后再传入上下文:
from docxtpl import DocxTemplate, InlineImage from docx.shared import Mm import requests from io import BytesIO from django.conf import settings from django.http import HttpResponse def generaraDocumento(request): # 调整响应头为docx正确的MIME类型,避免客户端识别错误 response = HttpResponse( content_type='application/vnd.openxmlformats-officedocument.wordprocessingml.document' ) response['Content-Disposition'] = 'attachment; filename="cv.docx"' doc = DocxTemplate(str(settings.BASE_DIR) + '/cv_api/templates/docx_filename.docx') # 下载远程图片 img_resp = requests.get(docente['foto_web_low'], timeout=10) # 可自行扩展异常处理逻辑,比如请求失败时使用本地默认占位图 img_resp.raise_for_status() # 封装为InlineImage对象,可自定义宽高参数 imagen = InlineImage( doc, BytesIO(img_resp.content), width=Mm(35) # 示例设置图片宽度为35毫米,可按需调整 ) context = {'imagen': imagen} doc.render(context) doc.save(response) return response
3. 模板占位符调整
无需修改原有模板占位符,保持{{ imagen }}即可正常渲染图片。
可选优化
- 图片请求失败时,加载本地默认占位图片传入
InlineImage,避免报错 - 可根据图片原始比例动态计算宽高,避免图片拉伸变形
内容的提问来源于stack exchange,提问作者Fernando Javier León
相关产品推荐
相关产品推荐

