我的媒体目录中有一个pdf文件,我希望用户下载,问题是,我如何让用户看到文件的大小,以便他们知道他们想要下载的文件的大小.

另外,是否更好地为pdf文件创建一个模型,如下所示的Models.py中所示? 处理这一问题的最佳方法是什么?我需要帮助.

Py(这暂时不是我的代码的一部分)

class PersonalStatement(models.Model):
    personal_statement = models.FileField(upload_to='personal_statement/')
    title = models.CharField(max_length=50)

views.py

def personal_statement_download(request):
    BASE_DIR = os.path.dirname(os.path.dirname(os.path.abspath(__file__)))
    filename = 'Writing-a-Personal-Statement.pdf'
    filepath = BASE_DIR + '/media/personal_statement/' + filename
    path = open(filepath, 'rb')
    mime_type, _ = mimetypes.guess_type(filepath)
    response = HttpResponse(path, content_type=mime_type)
    response['Content-Disposition'] = "attachment; filename=%s" % filename
    return response

urls.py

path('personal_statement/download/', views.personal_statement_download,name='personal_statement_download'),

模板/index.html

<a href="{% url 'personal_statement_download'%}" class="applyRightContentContainerSubDownloadLink"> Download File &#8681;</a>

Index.html的views.py

def home (request):
    return render(request, 'core/index.html')

推荐答案

我认为personal_statement_download没有多大意义:Django通常会提供媒体文件或静态文件.事实上,这些服务通常由Nginx或Apache等Web服务器提供,因为它可能(多得多)更高效和更安全.

但无论如何,我们都可以通过以下命令获得文件的大小:

import os
import os.path

from django.conf import settings


def home(request):
    filename = 'Writing-a-Personal-Statement.pdf'
    file_stats = os.stat(os.path.join(settings.MEDIA_ROOT, filename))
    file_size = file_stats.st_size
    return render(request, 'core/index.html', {'file_size': file_size})

然后我们可以使用|filesizeformat template filter [Django-doc]来正确地格式化文件大小:

{% load static %}
<a href="{% get_media_prefix %}Writing-a-Personal-Statement.pdf" class="applyRightContentContainerSubDownloadLink">
   Download File &#8681; ({{ file_size|filesizeformat }})
</a>

通过使用{% get_media_prefix %},我们可以让Web服务器处理文件下载.在调试模式下,Django还提供媒体文件,如果您将其添加到路径中.

Django相关问答推荐

将所有守护用户对象权限从一个Django用户重新分配给另一个Django用户

Django如何在没有ctrl点击的情况下允许多选

在 Django 中按月份和年份对帖子进行分类

反向 url django 管理员

如何在 gunicorn conf 文件中指定 uvicorn 工作人员

Django获取具有值的相关对象的计数并将其添加到注释中

try 编辑/创建时,特定模型的 Django 管理员挂起(直到超时错误)

Django 视图 - 首先从调用应用程序的目录加载模板

在 Django 过滤器语句中,__exact 和等号 (=) 有什么区别?

如何将 Django forms.ChoiceField 呈现为 Twitter Bootstrap 下拉菜单

Django聚合:仅求和返回值?

使用 lambda 作为属性的默认值时,Django 1.7.1 Makemigrations 失败

Django:如何使用动态(非模型)数据预填充 FormView?

Django - 无法为具有动态 upload_to 值的 ImageField 创建迁移

如何在 Django 和 django-jsonfield 中将 JSONField 的默认值设置为空列表?

Python - 覆盖 __init__ 的最干净方法,其中在 super() 调用之后必须使用可选的 kwarg?

警告:找不到分发的 svn 位置==0.6.16dev-r0

BASE DIR 的绝对路径是什么?

django.urls.path中name参数的作用是什么?

确保只有一个工作人员在运行多个工作人员的 pyramid 网络应用程序中启动 apscheduler 事件