У меня есть Dropzone, куда пользователь загружает файлы.Когда он нажимает на удалить файл, файл удаляется с дисплея Dropzone.Но я хочу также удалить их из базы данных.
Проблема в том, что я не могу запросить базу данных, для удаленного файла, потому что имя файла, хранящегося на сервере dropzone и django, отличается в случае дублирования имен файловили когда в исходном имени файла есть пробел или специальные символы.
Я использую django 2.1.
Dropzone Code - я сохраняю имена файлов в массиве file_up_names.
success: function(file) {
file_up_names.push(file_name);
return file.previewElement.classList.add("dz-success");
}
Функция удаления файла Dropzone -
removedfile: function(file) {
var _ref;
if ((_ref = file.previewElement) != null) {
_ref.parentNode.removeChild(file.previewElement);
var textArea = document.getElementById('text-area');
ct -= 1
textArea.innerText = ct
}
for(var i=0;i<file_up_names.length;++i){
if(file_up_names[i]==file.name) {
var delArea = document.getElementById('delete-check');
var f = file_up_names.splice(i,1)
//create an ajax request to delete the file. i.e. POST request to the DeleteView.
//delete based on session key and file name match.
var xmlhttp = new XMLHttpRequest();
var url = "delete/";
var a = document.getElementById('session').innerText;
url = url + a;
url = url + "/";
url = url + f;
var delArea = document.getElementById('delete-check');
xmlhttp.onreadystatechange = function() {
if (this.readyState == 4 && this.status == 200) {
var myArr = JSON.parse(this.responseText);
delArea.innerText = myArr.success;
}
else
{
delArea.innerText="not able to delete";}
};
xmlhttp.open("GET", url, true);
xmlhttp.send();
}}
URL для функции удаления выглядит следующим образом:
path('upload/delete/<str:session>/<str:filename>/',delete_picture,name='delete'),
Файл сохраняется в папке изображений.И моя функция удаления файла выглядит следующим образом: -
def delete_picture(request, session, filename):
found = None
try:
for obj in Picture.objects.all():
print("filename is : ",obj.file.name)
if obj.session == session and obj.file.name == "pictures/" + filename:
found = obj
break
except:
pass
if found is not None:
obj.delete()
return JsonResponse({'success': True})
else:
return JsonResponse({'success': False})
Это прекрасно работает, когда у меня нет файлов с повторяющимися именами и когда в именах файлов нет специальных символов.Я ожидаю найти какой-нибудь способ удаления файлов из базы данных, когда пользователь нажимает кнопку удалить файл в зоне сброса, когда два файла с одинаковым именем или именем файла содержат специальные символы.