【问题标题】:Get the URL of the file I just uploaded via form in Django获取我刚刚通过 Django 中的表单上传的文件的 URL
【发布时间】:2020-07-11 20:15:40
【问题描述】:

我有这个带有 FileField 的模型

class Attachment(models.Model):
    file = models.FileField(upload_to='%Y/%m/%d/')
    timestamp = models.DateTimeField(default=timezone.now)

使用此表单完成上传

class AttachmentForm(ModelForm):
    class Meta:
        model = Attachment
        fields = ['file']

还有这个js

function upload(event) {
  event.preventDefault()
  var data = new FormData($('#attachment_form').get(0))
  $.ajax({
    url: $(this).attr('action'),
    type: $(this).attr('method'),
    data: data,
    cache: false,
    processData: false,
    contentType: false,
  })

  $('#id_file').val('')

  // send message to server
  chatSocket.send(
    JSON.stringify({
      command: 'send',
      room: currentRoom,
      // message: ??
    })
  )
  return false
}

$(function () {
  $('#attachment_form').submit(upload)
})

我的这部分视图处理表单

# form to upload attachments
  if request.method == 'POST':
    attachment_form = AttachmentForm(request.POST, request.FILES)
    if attachment_form.is_valid():
      # file is saved
      attachment_form.save()
  else:
    attachment_form = AttachmentForm()

我在实时聊天应用程序中使用此表单。我想要的是:用户上传一个文件,然后javascript会向websocket发送一条包含新上传文件的URL的消息,这样服务器就可以将附件广播给其他用户。

如何获取我刚刚上传的文件的 URL?请记住,我不能只使用MEDIA_ROOT + 构造它,无论upload_to 字段显示+文件名,例如,如果上传了两个同名文件,Django 将在第二个文件中填充几个字符名字的结尾。

【问题讨论】:

  • 您有处理文件上传/表单 POST 的视图吗?
  • 是的,感谢您指出这一点。我更新了我的帖子
  • 那么,有什么问题呢?既然django更改了同目录下同名文件的名称,它也把这个和子目录一起保存在数据库中?
  • 我会亲自将upload_to构造为固定字符串,然后在上传之前将子目录作为动态生成的部分添加到fliename。
  • 我仍然不明白如何获取文件的路径

标签: django file-upload


【解决方案1】:

如果你在 django 中有这个对象 你可以做

attachment.file.url

【讨论】:

  • 我只能通过request.FILES访问上传的文件
  • 上传文件后,您会将其保存在一个对象中,对吧?附件是那个对象
  • 当然。我如何找到那个对象?通过在表单上调用save() 将文件保存到数据库中。您不直接引用对象。
  • 你总是可以做 obj = attachment_form.save() ,所以你会得到在 obj 中保存对象的参考
  • 正如@BrankoRadojevic 所说,然后您使用 obj.file.url 获取网址
猜你喜欢
  • 2015-02-12
  • 2014-11-26
  • 1970-01-01
  • 1970-01-01
  • 2019-10-03
  • 1970-01-01
  • 2019-10-23
  • 2013-11-02
  • 2014-04-19
相关资源
最近更新 更多