Python Web开发:动态生成Word文档

来自CloudWiki
跳转至: 导航搜索

前期回顾

在前面的内容中,

当招聘人员保存审批结果时,系统自动给当事人发送邮件:

Python21052901.png

下面我们改一改,当系统通过时,自动生成Word版简历.

实训步骤

安装库

pip install docxtpl


编写Word模板

制作Word模板文件,在指定位置插入模板标签,使用模板标签{{模板变量}}来声明

在media/contact文件夹下创建一个简历模板文件recruit.docx

Python21052902.png

修改信号触发器

from django.db.models.signals import post_init, post_save
from django.dispatch import receiver
from django.dispatch import receiver
from django.core.mail import send_mail
import os
from docxtpl import DocxTemplate
from docxtpl import InlineImage
from docx.shared import Mm, Inches, Pt

@receiver(post_init, sender=Resume)
def before_save_resume(sender, instance, **kwargs):
    instance.__original_status = instance.status


@receiver(post_save, sender=Resume)
def post_save_resume(sender, instance, **kwargs):
    email = instance.email  # 应聘者邮箱
    EMAIL_FROM = '458976849@qq.com'  # 企业QQ邮箱

    if instance.__original_status == 1 and instance.status == 2:
        email_title = '通知:云计算科技与艺术协会招聘初试结果'
        email_body = '恭喜您通过本社团初试'
        send_status = send_mail(email_title, email_body, EMAIL_FROM, [email])

        template_path = os.getcwd() + '/media/contact/recruit.docx'  #模板文件
        template = DocxTemplate(template_path)
        # 从instance实例中获取当前简历字段信息
        name = instance.name
        personID = instance.personID
        sex = instance.sex
        email = instance.email
        birth = instance.birth
        edu = instance.edu
        school = instance.school
        major = instance.major
        position = instance.position
        experience = instance.experience
        photo = instance.photo

        context = {
            'name': name,
            'personID': personID,
            'sex': sex,
            'email': email,
            'birth': birth,
            'edu': edu,
            'school': school,
            'major': major,
            'position': position,
            'experience': experience,
            'photo': InlineImage(template, photo, width=Mm(30), height=Mm(40)),
        }
        template.render(context)
        filename = '%s/media/contact/recruit/%s_%d.docx' % (
            os.getcwd(), instance.name, instance.id)
        template.save(filename)

    elif instance.__original_status == 1 and instance.status == 3:
        email_title = '通知:云计算科技与艺术协会招聘初试结果'
        email_body = '很遗憾,您未能通过本社团初试,感谢您的关注'
        send_status = send_mail(email_title, email_body, EMAIL_FROM, [email])

效果图

Python21052903.png