【问题标题】:Download file stored in a model with FileField using Django使用 Django 下载存储在具有 FileField 的模型中的文件
【发布时间】:2022-01-14 03:16:39
【问题描述】:

我打算在 Django 中创建一个简单的文件上传应用程序(并入一些更大的项目中)。对于这个,我使用了两个链接:/files/ - 列出来自特定用户的所有上传文件,/files/upload/ - 显示上传表单供用户在服务器上添加新文件。

我正在使用 PostgreSQL 数据库,我计划将我的所有文件存储在 File 模型中,如下所示:

class File(models.Model):
    content = models.FileField()
    uploader = models.ForeignKey(User, on_delete=models.CASCADE)

我的文件上传视图如下所示:

@login_required
def file_upload_view(request):
    if request.method == "POST" and request.FILES['file']:
        file = request.FILES['file']
        File.objects.create(content=file, uploader=request.user)
        return render(request, "file_upload_view.html")
    else:
        return render(request, "file_upload_view.html")

而我的文件列表视图看起来像这样:

@login_required
def file_view(request):
    files = File.objects.filter(uploader = request.user)
    return render(request, "file_view.html", {'files': files})

问题是,我希望我的file_view() 在模板中显示某个用户上传的所有文件(我已经这样做了),每个文件都有一个指向其下载位置的超链接。我一直在尝试在我的文件列表模板中执行此操作:

{% extends 'base.html' %}
{% block content %}
<h2>Files of {{ request.user }}</h2>
<br>
{% for file in files %}
    <a href="{{ file.content }}" download>{{ file.content }}</a>
{% endfor %}
{% endblock %}

但我的浏览器正在尝试下载一些.htm 页面,即使我上传的文件类型为.txt

我的问题是:在将文件添加到模型之前,我是否还需要将文件上传到某个目录中?我是否需要在我的模型中实际添加文件的 URL 作为新字段?文件不是自动上传到我的 PostgreSQL 数据库吗?

任何帮助将不胜感激。 谢谢。

【问题讨论】:

    标签: python django postgresql


    【解决方案1】:

    我猜你应该像这样显示一个文件夹到你想要保存文件的位置:

    content = models.FileField(upload_to='/myfiles/')
    

    然后您可以在 html 中显示 url ("{% url 'file.url' %}"),因为数据库实际上保存了文件的 url 并将文件本身存储在您在模型中显示的文件夹中。

    【讨论】:

    • 是的。但我不希望其他用户也访问该文件。我只希望上传者从指定的列表模板中访问它。
    猜你喜欢
    • 1970-01-01
    • 2019-02-27
    • 2011-12-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-06-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多