根据请求将上传的文件保存在子文件夹中

时间:2017-04-20 19:07:38

标签: python django file-upload

我有一个网站,可以让用户上传文件。这些文件附加到节点,该ID是上载请求的一部分。由于同一文件可能附加到不同的节点,Django将通过向文件名添加哈希来重命名该文件。因此,如果用户下载先前上载的文件,则它不具有原始文件名。

是否可以在媒体文件夹中创建文件上传的子目录(以节点ID命名)?我发现最接近的解决方案是更改FileField的系统存储,但这对于那个模型的所有文件都是静态的。或者是否有另一种更好的方法来解决重复文件的问题?

型号:

class Attachment(models.Model):
    node = models.IntegerField(default=-1)
    file = models.FileField(upload_to=".")

查看:

def file_upload(request):
    if request.method == "POST":
        form = UploadFileForm(request.POST, request.FILES)
        if form.is_valid():
            instance = Attachment(file=request.FILES["file"], node_id=request.POST["node_id"])
            instance.save()
            return HttpResponse(instance.file.url)

2 个答案:

答案 0 :(得分:1)

是的,请查看documentation on upload_to

您可以执行以下操作,其中包括node ID(在upload_to路径中定义为模型中的整数:

def attachment_path_with_node(instance, filename):
    return "attachments/{}/{}".format(instance.node, filename)

class Attachment(models.Model):
    node = models.IntegerField(default=-1)
    file = models.FileField(upload_to=attachment_path_with_node)

答案 1 :(得分:0)

也可以像这样进一步自定义路径:

document = models.FileField(upload_to='documents/%Y/%m/%d/')

将上传到:MEDIA_ROOT/documents/2020/12/22/

请访问 https://simpleisbetterthancomplex.com/tutorial/2016/08/01/how-to-upload-files-with-django.html

查看更多信息