【发布时间】: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