🗂

DjangoでPDFダウンロード機能

2023/02/15に公開

PDFをcloudinaryに上げる

  • cloudinaryというクラウドサービスを用いることでファイルや画像の取り扱いが非常に楽になります。おすすめです。

インストール

pip install cloudinary
  • settings.pyにcloudinaryを設定
INSTALLED_APPS = [
....
'cloudinary',
'cloudinary_storage',
....
]

models.py

  • models.pyにファイルのモデルを追加します。
class MyFile(models.Model):
    file = models.FileField(upload_to='download/')
    name = models.CharField(max_length=255, blank=True)
    upload_date = models.DateTimeField(auto_now_add=True)

views.py

  • views.pyにダウンロード処理を追加します。やり方①
def download_pdf(request, public_id):
    pdf_url = cloudinary.api.resource(public_id, resource_type="raw")["url"]
    response = HttpResponse(pdf_url)
    response["Content-Disposition"] = f"attachment; filename={public_id}.pdf"
    return response
  • 1行目:Cloudinary APIを使用して、指定されたパブリックIDに関連するPDFファイルのURLを取得します。

  • 2行目:HTTPレスポンスオブジェクトを作成します。このレスポンスには、PDFファイルのURLが含まれます。(webサーバがブラウザに送信するデータ)

  • 3行目:ダウンロード時にファイル名を指定します。

  • 4行目:ファイルがダウンロードされるための必要な情報を出力

  • models.pyから.object.all()でhtmlに表示するやり方もいいと思います。やり方②

def file_list(request):
    myfiles = MyFile.objects.all()
    return render(request, 'あなたのurl.html', {'myfiles': myfiles})
  • html例です。こんな感じで表示できるのでとても楽ですね。
{% for myfile in myfiles %}
        <tr>
            <td>{{ myfile.name }}</td>
            <td>{{ myfile.upload_date }}</td>
            <td><a href="{{ myfile.file.url }}">{{ myfile.file.name }}</a></td>
        </tr>
{% endfor %}

urls.py

  • urls.pyを追加します。views.pyやり方②の方は追加する必要はありません。
from .views import download_pdf

urlpatterns = [
    path("download/<str:public_id>/", download_pdf, name="download_pdf"),
]

admin.py

  • adminにMyfileを追加
from ads.models import MyFile

admin.site.register(MyFile)
  • adminからファイルを追加してあげるとcloudinaryに保存されます。ローカルに保存するよりもレスポンスが早くなります多分。無料で使える枠が結構あるのでcloudinaryおすすめです。

Discussion