使用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
相关产品推荐
相关产品推荐

