如何生成文件下载链接?

问题描述 投票:1回答:2

我在不使用FileField()的情况下创建了一个模型,并将url保存到路径字段中。现在显示我可以看到属性,但我无法下载文件。 href将其视为一个页面,我收到一条错误,说GET请求失败。

我也需要为静态文件做同样的事情。

models.py看起来像这样:

import os

from django.conf import settings
from django.db import models

# Create your models here.
class Document(models.Model):
    code = models.CharField(max_length = 50)
        path = models.CharField(max_length = 500)
    date_of_submission = models.CharField(max_length = 50)
    type = models.CharField(max_length = 50)
    title = models.CharField(max_length = 200)
    department = models.CharField(max_length = 50)
    subject = models.CharField(max_length = 100)
    updation_allowed = models.CharField(max_length = 1, default = '0')

    @property
    def relative_path(self):
        return os.path.relpath(self.path, settings.MEDIA_ROOT)

模板有一些像这样的代码:

    <a href = '{{ MEDIA_URL }}{{ value.thesis.relative_path }}'> Thesis </a>

    *static files*
   <a href='/uploads/report.pdf'> Front Page</a>

我尝试使用该属性并自己提供路径。

django python-3.x django-templates
2个回答
0
投票

urls.py(project / urls.py)

from django.conf.urls.static import static

urlpatterns = [
    ...
]

urlpatterns += static(settings.STATIC_URL, document_root=settings.STATIC_ROOT)
urlpatterns += static(settings.MEDIA_URL, document_root=settings.MEDIA_ROOT)

settings.朋友

...

STATIC_ROOT = os.path.join(BASE_DIR, 'static')
STATIC_URL = '/static/'

MEDIA_ROOT = os.path.join(BASE_DIR, 'media')
MEDIA_URL = '/media/'

0
投票

要允许文件下载,您需要创建一个单独的视图,并将FileResponse作为响应。这个视图将使用html模板中提供的url来获取一些独特的参数(我认为它将是文件的相对路径)。在此视图中,FileResponse将按提供的路径打开您的文件,然后将返回您的文件的响应。我想你应该这样做:

views.朋友:

def download_file(request, relative_path): # this is a view with file response
    media_root = settings.MEDIA_ROOT
    return FileResponse(open(f"{media_root}\{relative_path}", "rb"), as_attachment=True, filename="some_name.smth")

模板:

    <a href = '{% url "download" relative_path=value.thesis.relative_path %}'> Thesis </a>

    *static files*
   <a href='/uploads/report.pdf'> Front Page</a>

URLs.朋友:

urlpatterns = [
    path("download-file/<slug:relative_path>/", views.download_file, name="download")]

您需要与PATCHes结合使其工作。

© www.soinside.com 2019 - 2024. All rights reserved.