تولید فایل PDF و CSV در جنگو
مقدمه
با سلام خدمت تمامی شما دانشپذیران خوب وبسایت پایتونی ها با یک مقاله آموزشی دیگه از سری مقاله های طراحی وبسایت با جنگو در خدمت شما مخاطبان خوب وبسایت پایتونی ها هستیم تا در این مقاله به ساخت فایل های CSV , PDF بپردازیم.
در ادامه خواهید دید که چگونه میتوانیم همان را با استفاده از اکشنهای سفارشی Django -admin پیادهسازی کنیم.
تولید فایل های پی دی اف با استفاده از پایتون
PDF مخفف عبارت Portable Document Format است که یکی از رسانه های دیجیتال پرکاربرد است که از پسوند pdf استفاده می کند. آنها بیشتر به دلیل توانایی آنها در ارائه و تبادل اسناد ترجیح داده می شوند. مستقل از نرم افزار، سخت افزار یا سیستم عامل، به طور قابل اعتمادی هستند.
پایتون کتابخانه ای به نام FPDF را در خود ارائه می دهد که مخفف Free PDF است که اجازه تولید فایل های PDF را می دهد. این کلاس برای انجام عملکرد خود به کلیدهای API نیاز ندارد.
برای استفاده از این کلاس، باید آن را با استفاده از دستور زیر نصب کنید:
pip install fpdf
حالا یک فایل پایتون در یک پوشه جدید ایجاد کنید و کد زیر را به آن اضافه کنید.
from fpdf import FPDF # creating a pdf variable to save the FPDF() class pdf = FPDF() pdf.add_page() # set font style and size for pdf pdf.set_font('Arial', size= 16) # creating cell pdf.cell(200, 10, txt = "Trial to generate a pdf file.", ln=2, align='C') # save file with extension pdf.output('Attempt.pdf')
کد به سادگی از پنج مرحله ای که در بالا توضیح دادیم پیروی می کند. پس از تنظیم سبک فونت و اندازه متنی که به فایل اضافه می کنیم، سلولی ایجاد کردیم که پارامترهای ارتفاع و عرض را به آن منتقل کردیم که محل قرارگیری متن در فایل را مشخص می کند. در نهایت، خروجی فایلی خواهد بود که میخواهیم با متنی که با استفاده از تابع خروجی pdf اضافه کردیم، تولید شود.
توجه داشته باشید که پس از اجرای این فایل، یک فایل pdf جدید با نام “Attempt.pdf” در همان پوشه ایجاد شده است. این فایل pdf به شکل زیر است:
با توجه به عکس بالا حالا شما یک فایل PDF دارید.
حالا می خواهیم با استفاده از فریم ورک جنگو اقدام به ساخت این فایل PDF جدید کنیم.
تولید یک فایل PDF با استفاده از جنگو
البته، در این مقاله من انتظار دارم که شما از قبل مفاهیم اولیه راه اندازی یک پروژه جنگو و ایجاد یک برنامه کاربردی در جنگو و پیکربندی آن را بدانید.
جنگو از کتابخانه PDF منبع باز ReportLab برای تولید فایل های pdf استفاده می کند. این کتابخانه قبل از استفاده باید با استفاده از pip نصب شود.
pip install reportLab
جنگو از view برای نمایش فایل های PDF استفاده می کند. بنابراین در برنامه خود کد زیر را به فایل views.py خود اضافه کنید.
from django.shortcuts import render import io from django.http import FileResponse from reportlab.pdfgen import canvas # Create your views here. @staff_member_required def generatePDF(request, id): buffer = io.BytesIO() x = canvas.Canvas(buffer) x.drawString(100, 100, "Let's generate this pdf file.") x.showPage() x.save() buffer.seek(0) return FileResponse(buffer, as_attachment=True, filename='attempt1.pdf')
ReportLab API روی اشیاء فایل مانند عمل می کند و از آنجایی که اشیاء FileResponse جنگو اشیاء فایل مانند را می پذیرند، تولید PDF در جنگو پویا است.
متغیر بافر دادههای PDF را که باید در فایل گنجانده شود را در بایت دریافت میکند، بنابراین ماژول io را وارد کردیم.
در مرحله بعد، یک متغیر ‘x’ را اعلام کردیم که از آن یک شی pdf با استفاده از شی بافر به عنوان فایل آن ایجاد کردیم.
اکنون که شی pdf ایجاد شده است، فایل را با کشیدن کاراکترهای رشته ای پر می کنیم. ماژول بوم وارد شده به ترسیم کاراکترهای رشته در این فایل کمک می کند. شما می توانید کلمه من را با هر کلمه ای که می خواهید استفاده کنید جایگزین کنید.
در نهایت فایل را پس از نمایش و ذخیره محتوا می بندیم.
برگرداندن پاسخ همانطور که در بالا انجام دادیم به طور خودکار نوع MIME را به عنوان application/pdf تنظیم می کند، از این رو به مرورگر اطلاع می دهد که سند یک فایل PDF است و از نوع دیگری مانند HTML نیست.
توجه داشته باشید که ما تمام متدهای بعدی تولید PDF را روی شی PDF، x و نه در بافر فراخوانی کردیم.
به یاد داشته باشید که این نما را در فایل urls.py برنامه خود به این صورت ثبت کنید:
. . . from django.urls import path from .views import generatePDF urlpatterns = [ path('<int:id>/generatePDF/', views.generatePDF, name='generatePDF'), . . .
ایجاد یک اقدام سفارشی Django-admin برای تولید فایل PDF
در فایل admin.py، یک تابع اکشن تعریف میکنیم که با کلیک بر روی یک دکمه اقدام سفارشی، فایل pdf را تولید میکند. عمل ما با توجه به آنچه به شرح خود منتقل می کنیم نامگذاری می شود. کد زیر را اضافه کنید:
from django.contrib import admin from .models import Person # Register your models here. class PersonAdmin(admin.ModelAdmin): @admin.action(description='Generate PDF file') def generatePDF(modeladmin, request, queryset): url ='templates/admin/person/?pks=' + ','.join(str([q.pk for q in queryset])) actions = [generatePDF] admin.site.register(Person, PersonAdmin)
متغیر URL شیء یک شناسه انتخاب شده خاص را در آن مسیر خاص دانلود می کند.
در نهایت، دکمه سفارشی را در یک فایل HTML در ساختار پوشه ای به شکل زیر ایجاد می کنیم
templates/admin/person/file.html
{% extends "admin/change_form.html" %} {% load i18n admin_urls %} {% block object-tools-items %} <li> <a href="{% url 'person:generatePDF' original.pk %}?next={% url 'admin:person_person_change' original.id %}" class="historylink">Generate PDF</a> </li> {% if has_absolute_url %} <li> <a href="{% url 'admin:view_on_site' content_type_id original.pk %}" class="viewsitelink">{% trans "View on site" %}</a> </li> {% endif %} {% endblock %}
الگوهای ایجاد شده در جنگو باید در فایل settings.py اضافه شوند.
TEMPLATES = [ { 'DIRS': [os.path.join(BASE_DIR, "person/templates")], . . . }
حالا از سرور لوکال هاست به صفحه مدیریت http://127.0.0.1:8000/admin/ دسترسی پیدا کنید و مشخصات خود را وارد کنید. به یک شی خاص که به مدل خود اضافه کرده اید دسترسی پیدا کنید و روی دکمه “Generate PDF” کلیک کنید تا فایل pdf ما ایجاد شود.
وقتی فایل را باز می کنید باید فایل و محتویاتی را که اضافه کرده ایم ببینید.
ساخت فایل CSV در پایتون
یک فایل CSV مخفف مقادیر جدا شده با کاما است که نوعی فرمت فایل است که مقادیر را ذخیره می کند و آنها را با جداکننده ای مانند کاما یا نیم دونقطه جدا می کند. پایتون از ماژول CSV برای ایجاد چنین فایلی استفاده می کند که به زودی خواهیم دید.
یک فایل با پسوند ‘.py’ ایجاد کنید و این کد را اضافه کنید.
import csv if __name__ == '__main__': with open('example.csv', 'w', newline='') as csvfile: writer = csv.writer(csvfile) for row in (('Name', 'Pythoniha'), ('Hobby', 'Writing'), ('City', 'Tehran')): writer.writerow(row)
ابتدا باید فایل CSV را با استفاده از تابع open باز کنیم. این تابع اگر فایلی وجود نداشته باشد آن را ایجاد می کند. بنابراین فایلی با نام example.csv ایجاد خواهد شد. اکنون میتوانیم با استفاده از شی Writer در فایل بنویسیم و مقادیر در خطوط جدید نوشته میشوند. ماژول CSV یک تابع نویسنده را فراهم می کند که عملکرد شی نویسنده را فعال می کند.
حلقه for از طریق پارامترهای CSV که اضافه کرده ایم حلقه می زند و آنها را در ردیف ها تنظیم می کند. فایل پایتون را اجرا کنید و باید یک فایل example.csv ایجاد شده در پوشه خود را مشاهده کنید که به شکل زیر است:
نام، لیزا
سرگرمی، نویسندگی
سیتی، نایروبی
راحت تر از چیزی که فکر می کردی هست، می دانم.
حالا بیایید همان فایل را با استفاده از اقدامات سفارشی Django-admin مانند زمانی که فایل pdf خود را تولید میکردیم، تولید کنیم.
ایجاد یک فایل CSV با استفاده از اقدامات سفارشی Django-admin
پایتون به راحتی از کتابخانه CSV استفاده می کند که قابلیت ایجاد CSV روی اشیاء فایل مانند عمل می کند.
این کد را به فایل views.py برنامه خود اضافه کنید.
from django.shortcuts import render from django.http import HttpResponse import csv def generateCSV(request, id): response = HttpResponse( content_type = 'text/csv', headers={'Content-Disposition':'attachment;filename="example.csv"'}, ) csvv = csv.writer(response) csvv.writerow(['Diana', 'has', 'a', 'police', 'case' ]) csvv.writerow(['Let', 'us', 'get', 'her', 'a', 'lawyer']) csvv.writerow(['shall', 'we', 'now']) return response
من شی HttpResponse را به یک نوع MIME خاص وصل کردم که به مرورگر می گوید فایل CSV است.
به این شی، ما همچنین یک هدر Content-Disposition اضافه می کنیم که نام فایل CSV ما را نگه می دارد.
سپس، شی csvv به API نسل CSV، شی پاسخ به عنوان آرگومان برای تابع csv.writer می رود. زیرا، این تابع انتظار دارد که یک شیء مانند فایل به آن ارسال شود، و ظاهراً HttpResponse دقیقاً همین است.
csvv.writerow مقادیر را به صورت ردیفی در فایل CSV می نویسد.
تا به حال می دانید که چگونه view ها را در فایل urls.py ثبت کنید. پس همین الان این کار را انجام دهید:
from django.urls import path from . import views from .views import generateCSV app_name = 'person' urlpatterns = [ path( '<int:id>/generateCSV', views.generateCSV, name='generateCSV' ), ]
ایجاد یک اکشن سفارشی Django-admin
این را در فایل admin.py بنویسید.
from django.contrib import admin from .models import Person import csv from django.http import HttpResponse # Register your models here. class PersonAdmin(admin.ModelAdmin): @admin.action(description="Generate CSV") def generateCSV(self, request, queryset): meta = self.model._meta field_names = [field.name for field in meta.fields] response = HttpResponse(content_type='text/csv') response['Content-Disposition'] = 'attachment; filename={}.csv'.format(meta) writer = csv.writer(response) writer.writerow(field_names) for obj in queryset: row = writer.writerow([getattr(obj, field) for field in field_names]) return response list_display = ['name', 'shirt_size'] ordering = ['name'] actions = [generateCSV] admin.site.register(Person, PersonAdmin)
اگر ما آن را به عنوان یک تابع پیاده سازی کنیم، یک دستور اکشن مدیریت همیشه به شکل زیر است.
def admin_action(modeladmin, request, queryset)
با این حال، همانطور که در بالا انجام دادیم، می توانید آن را به عنوان یک متد به کلاس ModelAdmin اضافه کنید.
عمل بالا فیلدهای موجود در مدل ما را واکشی می کند و از طریق آنها حلقه می زند. content_type به ما این امکان را می دهد که این نوع فیلدها را به شکل CSV برگردانیم.
این عمل به ما امکان می دهد تمام فیلدهای مدل را انتخاب کرده و آنها را به عنوان یک فایل CSV صادر کنیم.
در این مقاله، ما دو فایل CSV را با استفاده از اقدامات سفارشی خود تولید می کنیم. یکی مقادیر شیء موجود در مدل خواهد بود. مورد دوم همان چیزی است که خودمان در تابع view ایجاد کردیم.
ایجاد یک فایل CSV با مقادیر شی مدل
سرور لوکال هاست را با استفاده از http://127.0.0.1:8000/admin/ اجرا کنید و به صفحه مدیریت بروید.
هنگامی که روی دکمه “Go” کلیک می کنید، یک فایل CSV ایجاد می شود و باید به شکل زیر باشد:
اجازه دهید اکنون دکمه اکشن را اضافه کنیم که به ما امکان میدهد فایل CSV را که ایجاد کردهایم، مانند زمانی که pdf را در یک فایل HTML ایجاد کردیم، تولید کنیم. ساختار فایل نیز یکسان خواهد بود.
templates/admin/person/file.html
{% extends "admin/change_form.html" %} {% load i18n admin_urls %} {% block object-tools-items %} <li> <a href="{% url 'person:generateCSV' original.pk %}?next={% url 'admin:person_person_change' original.id %}" class="historylink">Generate CSV</a> </li> {% if has_absolute_url %} <li> <a href="{% url 'admin:view_on_site' content_type_id original.pk %}" class="viewsitelink">{% trans "View on site" %}</a> </li> {% endif %} {% endblock %}
هنگامی که یک شی خاص از مدل را انتخاب می کنید، این دکمه ظاهر می شود.
اکنون به صفحه مدیریت خود بروید و ببینید که اکنون چگونه کار می کند.
با کلیک بر روی دکمه ایجاد CSV، فایل CSV ما ایجاد می شود که اکنون شبیه چیزی است که ما ایجاد کرده ایم.
جمع بندی
ما در این مقاله سعی کردیم با استفاده کتابخانه های دیگر در جنگو به تهیه و تولید فایل های Csv و PDF بپردازیم، در طول مسیر، ما یاد گرفتیم که چگونه از اکشن های سفارشی از Django-admin برای اجرای هدف خود استفاده کنیم. امیدوارم امروز چیز جدیدی یاد گرفته باشید.
خوب حالا شما هم می توانید با استفاده از این مقاله به تولید فایل های PDF , CSV بپردازید.