【问题标题】:How to generate link for file download?如何生成文件下载链接?
【发布时间】:2019-09-15 18:38:10
【问题描述】:

我在不使用 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


    【解决方案1】:

    urls.py(项目/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.py

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

    【讨论】:

      【解决方案2】:

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

      Views.py:

      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.py:

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

      您需要结合 PATHes 才能使其工作。

      【讨论】:

        猜你喜欢
        • 2012-08-05
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2019-06-21
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多