021-71053903 [email protected] پشتیبانی از شنبه تا چهارشنبه ساعت 9 الی 16

تولید فایل PDF و CSV در جنگو

تولید فایل 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 بپردازید.

محمدرضا حسنی

224 مطلب منتشر شده

دانش آموخته رشته فناوری اطلاعات / موسس پایتونی ها

درباره این مطلب نظر دهید !

مطالب پرمخاطب پایتونی ها

محصولات فروش پایتونی ها

%60
تخفیف

آموزش فیگما (Figma)

30,000 تومان
2