У меня есть эта модель с 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 отправляет сообщение в веб-сокет, содержащее URL-адрес недавно загруженного файла, чтобы сервер мог транслировать вложение другим пользователям.
Как мне получить URL-адрес только что загруженного файла? Имейте в виду, что я не могу просто создать его с помощью MEDIA_ROOT
+ независимо от того, что в поле upload_to
написано + имя файла, например, если загружены два файла с одинаковым именем, Django заполнит второй файл несколькими символами в конце имени.