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

使用WeasyPrint-Django生成PDF时遭遇__init__参数错误求助

Django中使用WeasyPrint生成PDF触发TypeError的解决方案

问题说明

在Django视图中使用WeasyPrint生成PDF时,触发如下错误:

TypeError: __init__() takes 1 positional argument but 3 were given

报错根源为WeasyPrint调用pydyf.PDF时参数传递方式不兼容。

报错栈信息

File "/mnt/e/digolearnsms/smsdigo/main/views.py", line 4460, in schoolSequenceReportpdf
    pdf = HTML(string=html_string).write_pdf()
  File "/mnt/e/digolearnsms/myenvubuntu/lib/python3.8/site-packages/weasyprint/__init__.py", line 259, in write_pdf
    self.render(font_config, counter_style, **options)
  File "/mnt/e/digolearnsms/myenvubuntu/lib/python3.8/site-packages/weasyprint/document.py", line 390, in write_pdf
    pdf = generate_pdf(self, target, zoom, **options)
  File "/mnt/e/digolearnsms/myenvubuntu/lib/python3.8/site-packages/weasyprint/pdf/__init__.py", line 127, in generate_pdf
    pdf = pydyf.PDF((version or '1.7'), identifier)
TypeError: __init__() takes 1 positional argument but 3 were given

相关代码

views.py

def schoolSequenceReportpdf(request,slug,pk,seq):
        host=request.META['HTTP_HOST']
        if request.user.is_authenticated:
            skoll       = None
            valuecheck  = None
            admin_check = False
            statistics  = None
            if request.user.is_school:
                #Calling the check school profile obj.
                skoll,valuecheck = check_for_skolProfile(request.user)
                # Calling the check accademic year object.
                accademic_yearObj,acc_valuecheck= check_for_accademicYear(skoll)
            else:
                try:
                    valuecheck= True
                    skoll= schoolProfile.objects.get(slug=slug)
                    accademic_yearObj,acc_valuecheck= check_for_accademicYear(skoll)
                    admin_check  = adminCheck(request.user,skoll)
                    if admin_check is False:
                        return redirect('main:wrongpage')
                except:
                    return redirect('main:wrongpage')
            
            if accademic_yearObj:
                #get classroom instance
                try:
                    classroomobj  = Level.objects.get(id=pk)
                    
                    sequence      = Sequence.objects.get(id=seq)
                    term          = sequence.term
                
                except:
                    term         = None
                    classroomobj = None
            else:
                term         = None
                classroomobj = None   
            sequence_report_cards  = FinalTermReport.objects.filter(sequence=sequence,classroom=classroomobj).order_by("-studentavg")
            statistics  = ClassroomResultStatistics.objects.filter(sequence=sequence,classlevel=classroomobj,seqstate=True).order_by("-created")
            terms     = Term.objects.filter(year=accademic_yearObj)
            sequences = Sequence.objects.filter(year=accademic_yearObj).order_by('-created')
            color = ReportCardColor.objects.filter(skoll=skoll)
            if color:
                color= color.first
            filling_session = FillMarksDateScheduling.objects.filter(year=accademic_yearObj,skoll=skoll,active=True,delete=False)
            context = {'color':color,'host':host,'statistics':statistics,'sequence_report_cards':sequence_report_cards,'sequence':sequence,'term':term,'filling_session':filling_session,'sequences':sequences,'statistics':statistics,'terms':terms,'admin_check':admin_check,'classroomobj':classroomobj,'name':classroomobj.name,'accademic_yearObj':accademic_yearObj,'accyear':acc_valuecheck,'skollobj':skoll,'valuecheck':valuecheck}
            html_string = render_to_string("main/sequencereportcardpdf.html", context)
            pdf = HTML(string=html_string).write_pdf()
            response = HttpResponse(pdf, content_type='application/pdf')
            response['Content-Disposition'] = f'attachment; filename="{classroomobj.name}.pdf"'
            return response

urls.py

url(r'^sequence/report/pdf/(?P<slug>[\w-]+)/(?P<pk>[0-9]+)/(?P<seq>[0-9]+)$',views.schoolSequenceReportpdf,name="sequencereportpdf"),

解决方案

该错误由WeasyPrint与依赖库pydyf版本不兼容导致:旧版本WeasyPrint采用位置参数调用pydyf.PDF(version, identifier),但新版本pydyf的PDF类初始化仅接受self作为位置参数,其余参数需以关键字形式传递。

有两种修复方式:

  • 方法一:降级pydyf到兼容版本
    执行以下命令安装指定版本的pydyf:
    pip install pydyf==0.10.0
    
  • 方法二:升级WeasyPrint到支持新版pydyf的版本
    执行以下命令升级WeasyPrint:
    pip install --upgrade weasyprint
    

内容的提问来源于stack exchange,提问作者Ebong

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.14 04:55:57