From 8eba3f0160696a8ecaeaac4660098aa8986bf58a Mon Sep 17 00:00:00 2001 From: xiaji Date: Mon, 12 Jan 2026 15:48:51 +0800 Subject: [PATCH] =?UTF-8?q?feat(=E8=81=94=E7=B3=BB=E4=BA=BA):=20=E6=B7=BB?= =?UTF-8?q?=E5=8A=A0=E8=81=94=E7=B3=BB=E4=BA=BA=E4=BF=A1=E6=81=AF=E5=AF=BC?= =?UTF-8?q?=E5=87=BA=E4=B8=BAPDF=E5=8A=9F=E8=83=BD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 在联系人列表页面添加导出为PDF按钮,实现将筛选后的联系人信息导出为PDF文件。新增视图函数处理PDF生成逻辑,支持中文显示并保留原有筛选条件。 --- fzjgact/db.sqlite3 | Bin 471040 -> 471040 bytes .../huodong/__pycache__/views.cpython-311.pyc | Bin 28596 -> 31788 bytes fzjgact/huodong/templates/contact_list.html | 679 +++++++++--------- .../custom_filters.cpython-311.pyc | Bin 2665 -> 2665 bytes fzjgact/huodong/urls.py | 1 + fzjgact/huodong/views.py | 103 +++ 6 files changed, 448 insertions(+), 335 deletions(-) diff --git a/fzjgact/db.sqlite3 b/fzjgact/db.sqlite3 index 2175f820e7156b051f755789ad199987c37cba06..2eb1374d477ae62ca8c178b6783c5f62a2648de5 100644 GIT binary patch delta 334 zcmZp8Ak*+bW`Z>1lZi6Uj88Tuq~;468YviHWJH($%&el4F-?*g+1 zm*sSJ2PR(@E=#`t&5i~SIaO7deHkmO@^Z3LD$UHzQ}c?`%(5zsQ}T=|3XF==D=hL8 zlM}VK$9XX=V`bLh)|}2Bz~s-wtqIh8k!!j~G!u`wkr~21Q&S5wQ!{NjW=F>9y0=)Q z+S8($fS7rES~SbN5+Qc>zYKi0dAIRQEx^ao$HFnN%D~bkpgca`vZOd7B0nYF b$iT=<*T7I0)1~c7H(7v~b-U6{wtHa!+~R0P delta 143 zcmZp8Ak*+bW`Z>1!-+D^j1M;^q~;46m?{_;TNzkb85-*un3-ExG+)c#el4F-?*g+r zSKM@V2PR)8zW&XQ1{_@5o{n|B+}MD83ecTOdsYCg_(rJF23%(`9aCfmI*0L17lsQ>@~ diff --git a/fzjgact/huodong/__pycache__/views.cpython-311.pyc b/fzjgact/huodong/__pycache__/views.cpython-311.pyc index f20300a8006d27e99eac6e137c94c6a17020fda6..1247d81c72e9c5523158ebdb7b7529439159d888 100644 GIT binary patch delta 2344 zcmZvddrVVT9LMizZ(D3{TcA+77AO=LRNU0ygFPsSKtX8>Qa4ctf!-Ec71(J_Hq#DW zbQ0s@DRaI!itpAZ3>2lwB6A7+@ok zb+t8CJDwnaSh8!VpHStnI~!`YR^kad0Q`vJzKVjTl;sYm(_yPyS5Z-8x6a9PkQZSQ zG++T!V&FYK(o%4!Bg5s9Bps4F7#`gw1gH!wh~wsJH{4%sS`=_Hk{xTV9@-t6U@o4p+a z`uSD%(3PSE6pNIKLBlhZ+#)46 znEouKDv&kXu`h|J^+sYXQENl$HipkQjoMHsF{rL!-q;vQ3MP^jC28GBKFv%M%mwFo zzLc4G2jVknCUwT|iuv*Uw69%|Pn+wvN#>6iF^6jdD;cJHMifk(F9;Q!yEZ5 zK0B~#HsUkP*dCTQEy||P$>#96kPos{na4j*YvuC=)3xfOI$wOfs3aHCQL&jeE8vso zb(%L2fO~-GLBCI}-Ee^J z?K?3pT)ZZMvQU=3eB&4=~1vXI&=TZ3Ks>sU1g-|F&u_xdCR#ztu zG{=WaM@s7RQo0kU6z4<37eHJ9mKjh8&{3EryWx=D?RjtP#QCw_;jvTucS~b|@e3DY z<{5JL==)J~{KS{{&VL*=@4tI){M-esg+dRZc>Ko0kHMX!u;9PId;<6z@GoEr@E?Ua z8^f|;25Lm_I0V*Bh>560J})(Pe+6CvKnGX_3fM&$wjr(slmWH_=r>~`lCJj74tGT2 z-qqsWiA@mC0T=;dXwL#904YEQNT4vM;06%=2#8&}(XvZGAO|P_96$;94uosKf}W#` z6}>s}T8KrjOck{vvgwtvRI{?yKvY-(?5X3Ar`(VOF^dm&kWbO z)g#>My_KUZchK>!<7nk|RzJe(!>oQn%4jpl4M#OAmK2SW{JP`aG^DIVVXgvRMdjX# zQH^1Okx3L$^vFgNxFd=~iqV{0!>)C!*%z+Ax=S zvK%ZMO`qH}YfUJmsq#mRbcy0mz(gEV$;4iMS&WmBkY3*}LRxaUp$L_e#|;njDq;3j z04qg=b#?OY*ut%cVD#Umf=D+PNo%S9sz@l^yoHr)qV^7i%1TCvUZ3PsA3mXE% w7s2o;Vq<}cVHh!nQQ%f`bw`FAQ#2&GIgb7&Wn<(&uq2Mn+-8UO$Q delta 824 zcmYjOOH30{6y*)mVhSw=P@pCyf(r!cg1nl}Rxj7#If zh1DC^CM;y3i80T(V`WHOx^dwo=+aei z3uw-u7Hox|*f|Ts;OKo~XS<^bff%fLVoM|k@FucCT;PrNl17L}dx(qC=sU4l5-gj6 zt5&Q!&B$v@nkhjdF-{DqCZ;4@-?>PYa&B4H^0KUzvCx!LOm#`88?v0kqZO@e&<03d zZ)dH^5;@&M(83OP>o`&x)WfR}xw{S?T?4(?*4S{U&zW*bLkm9kKBW-$VE(Z{9N<|P zB7Jam;d_st3kEn0B3NQh&#QEfkLu^e!=Y!OpbXj1WB!4#r^*e{HiEIpeyO5B0zj6# z92Ys6!%5~}elCz8SS$VZ!|E{TdN&LfPa!p4yiy-VmKPtuI6+{*xWGOYXKRr^te^eI z4 -

联系人信息

- - -
-
- -
- -
- -
- - - - - - -
- - - -
-
- - -
- - -
- - -
- - -
- -
- - -
-
- - - -
- - - - - - - - - - - - - {% for contact in contacts %} - - - - - - - - {% empty %} - - - - {% endfor %} - -
分支机构分类姓名电话邮箱
{{ contact.branch.name }}{{ contact.category|default:"" }}{{ contact.name|default:"" }}{{ contact.phone|default:"" }}{{ contact.email|default:"" }}
没有找到匹配的联系人
- - - +{% extends "base.html" %} + +{% block content %} +
+

联系人信息

+ + +
+
+ +
+ +
+ +
+ + + + + + +
+ + + +
+
+ + +
+ + +
+ + +
+ + +
+ +
+ + +
+
+ + + +
+ + + + + + + + + + + + + {% for contact in contacts %} + + + + + + + + {% empty %} + + + + {% endfor %} + +
分支机构分类姓名电话邮箱
{{ contact.branch.name }}{{ contact.category|default:"" }}{{ contact.name|default:"" }}{{ contact.phone|default:"" }}{{ contact.email|default:"" }}
没有找到匹配的联系人
+ + +
+ + {% endblock %} \ No newline at end of file diff --git a/fzjgact/huodong/templatetags/__pycache__/custom_filters.cpython-311.pyc b/fzjgact/huodong/templatetags/__pycache__/custom_filters.cpython-311.pyc index b384739f3fd58626fbf5125f4791de7e2c3ffdf7..496100f5daad0af8a34f3572a4febc05fe207d09 100644 GIT binary patch delta 20 acmaDU@=}C*IWI340}!-krEKJm;{pIZhy_Rh delta 20 acmaDU@=}C*IWI340}$*tir&Z_#{~dAp#?zz diff --git a/fzjgact/huodong/urls.py b/fzjgact/huodong/urls.py index 9cdced3..827353f 100644 --- a/fzjgact/huodong/urls.py +++ b/fzjgact/huodong/urls.py @@ -15,6 +15,7 @@ urlpatterns = [ path('branch/info/', views.Branchinfo, name='branchinfo'), path('statistics/', views.Statistics, name='statistics'), path('contact/', views.contact_list, name='contact-list'), + path('contact/export/pdf/', views.export_contacts_pdf, name='export-contacts-pdf'), path('equipment-images/', views.equipment_images, name='equipment-images'), path('public-screens/', views.public_screens, name='public-screens'), path('video-terminals/', views.video_terminal_list, name='video-terminals'), diff --git a/fzjgact/huodong/views.py b/fzjgact/huodong/views.py index 93d831e..90b11b7 100644 --- a/fzjgact/huodong/views.py +++ b/fzjgact/huodong/views.py @@ -466,6 +466,109 @@ def contact_list(request): return render(request, 'contact_list.html', context) +def export_contacts_pdf(request): + # 创建响应对象 + response = HttpResponse(content_type='application/pdf') + response['Content-Disposition'] = 'attachment; filename="contacts_info.pdf"' + + # 注册中文字体 + from reportlab.pdfbase import pdfmetrics + from reportlab.pdfbase.ttfonts import TTFont + + # 尝试注册系统中文字体,这里使用Windows系统自带的中文字体 + try: + # 尝试注册微软雅黑字体 + pdfmetrics.registerFont(TTFont('MSYaHei', 'C:/Windows/Fonts/msyh.ttc')) + chinese_font = 'MSYaHei' + except: + try: + # 如果微软雅黑不存在,尝试注册宋体 + pdfmetrics.registerFont(TTFont('SimSun', 'C:/Windows/Fonts/simsun.ttc')) + chinese_font = 'SimSun' + except: + # 如果都找不到,使用默认字体(可能仍会有乱码) + chinese_font = 'Helvetica' + + # 创建PDF文档 + doc = SimpleDocTemplate(response, pagesize=letter) + elements = [] + + # 添加标题 + styles = getSampleStyleSheet() + # 复制Title样式并修改字体 + title_style = ParagraphStyle( + 'ChineseTitle', + parent=styles['Title'], + fontName=chinese_font, + fontSize=18, + spaceAfter=30, + alignment=1 # 1表示居中 + ) + title = Paragraph("联系人信息", title_style) + elements.append(title) + + # 获取筛选参数 + branches_param = request.GET.get('branches') + category = request.GET.get('category') + contact_name = request.GET.get('contact_name') + + # 构建查询条件 + filters = Q() + + # 分支机构筛选(支持多选) + if branches_param: + branch_ids = [bid.strip() for bid in branches_param.split(',') if bid.strip().isdigit()] + if branch_ids: + filters &= Q(branch_id__in=branch_ids) + + # 联系人类别筛选 + if category: + filters &= Q(category__contains=category) + + # 联系人姓名筛选 + if contact_name: + filters &= Q(name__icontains=contact_name) + + # 获取筛选后的联系人 + contacts = Contact.objects.filter(filters) + + # 准备表格数据 + data = [['分支机构', '分类', '姓名', '电话', '邮箱']] # 表头 + for contact in contacts: + data.append([ + contact.branch.name if contact.branch else '', + contact.category or '', + contact.name or '', + contact.phone or '', + contact.email or '' + ]) + + # 创建表格 + table = Table(data) + + # 设置表格样式 + style = TableStyle([ + ('BACKGROUND', (0, 0), (-1, 0), colors.grey), + ('TEXTCOLOR', (0, 0), (-1, 0), colors.whitesmoke), + ('ALIGN', (0, 0), (-1, -1), 'CENTER'), + ('FONTNAME', (0, 0), (-1, 0), chinese_font), # 使用中文字体 + ('FONTSIZE', (0, 0), (-1, 0), 14), + ('BOTTOMPADDING', (0, 0), (-1, 0), 12), + ('BACKGROUND', (0, 1), (-1, -1), colors.beige), + ('FONTNAME', (0, 1), (-1, -1), chinese_font), # 使用中文字体 + ('GRID', (0, 0), (-1, -1), 1, colors.black) + ]) + table.setStyle(style) + + # 添加表格到文档 + elements.append(table) + + # 构建PDF + doc.build(elements) + + return response + + def video_terminal_list(request): # 获取筛选参数 selected_branch = request.GET.get('branch', '')