Когда я загружаю файлы с помощью dropzone, он добавляет их в базу данных, но у них нет файла, а только идентификатор и дата создания. Я думаю, что это проблема, но я пробовал массу вещей, и я не могу понять это. См. Мои изменения ниже для более подробной учетной записи.
Вот представление
@login_required(login_url='/dashboard-login/')
def dashboard(request):
current_user = request.user
current_client = request.user.client
files = ClientUpload.objects.filter(client=current_client)
form = UploadFileForm()
if request.method == 'POST':
if request.FILES is None:
logger = logging.getLogger(__name__)
logger.warning("No files were attached to the upload.")
return HttpResponseBadRequest('No Files Attached.')
if form.is_valid():
upload = form.save()
form = UploadFileForm(request.POST, request.FILES)
else:
uploaded_files = [request.FILES.get('file_upload[%d]' % i)
for i in range(0, len(request.FILES))]
for f in uploaded_files:
client_upload = ClientUpload.objects.create(client=current_client, file_upload=f)
#for key in request.FILES:
# cupload = ClientUpload.objects.create(client=current_client, file_upload=request.FILES[key])
logger = logging.getLogger(__name__)
logger.debug(request.FILES)
logger.info("File(s) uploaded from " + current_client.company)
return HttpResponseRedirect(reverse('dashboard'))
data = {'form': form, 'client': current_client, 'files': files}
return render_to_response('dashboard.html', data, context_instance=RequestContext(request))
Вот мои параметры dz:
url: '127.0.0.1:8003/dashboard/',
method: "post",
withCredentials: false,
parallelUploads: 12,
uploadMultiple: true,
maxFilesize: 256*4*2,
paramName: "file_upload",
createImageThumbnails: true,
maxThumbnailFilesize: 20,
thumbnailWidth: 100,
thumbnailHeight: 100,
maxFiles: 12,
params: {},
clickable: true,
ignoreHiddenFiles: true,
acceptedFiles: null,
acceptedMimeTypes: null,
autoProcessQueue: false,
addRemoveLinks: true,
previewsContainer: null,
dictDefaultMessage: "Drop files here to upload",
dictFallbackMessage: "Your browser does not support drag and drop file uploads.",
dictFallbackText: "Please use the fallback form below to upload your files.",
dictFileTooBig: "File is too big ({{filesize}}MB). Max filesize: {{maxFilesize}}MB.",
dictInvalidFileType: "You can't upload files of this type.",
dictResponseError: "Server responded with {{statusCode}} code.",
dictCancelUpload: "Cancel upload",
dictCancelUploadConfirmation: "Are you sure you want to cancel this upload?",
dictRemoveFile: "Remove",
dictRemoveFileConfirmation: null,
dictMaxFilesExceeded: "You can only upload {{maxFiles}} files.",
И вот шаблон:
{% load i18n %}
{% load staticfiles %}
{% load crispy_forms_tags %}
<link href="{% static 'css/dropzone2.css' %}" type="text/css" rel="stylesheet"/>
<form class="dropzone" id="myDropzone" method="post" action="{% url 'dashboard' %}" enctype="multipart/form-data">
{% csrf_token %}
<div class="fallback">
<input name="file" type="file" multiple />
</div>
</form>
<button class="upload-control btn-success btn" type="submit" id='submit-all' onclick="document.getElementById('myDropzone').submit()">
<i class="glyphicon glyphicon-upload"></i>
<span>{% trans 'Submit' %}</span>
</button>
<style>
.upload-control {
margin-top: 10px;
margin-bottom: 0px;
}
</style>
<script src="{% static 'js/dropzone.js' %}"></script>
<script src="{% static 'js/jquery-2.1.4.min.js' %}"></script>
<script type="text/javascript">
Dropzone.autoDiscover = false
$(document).ready(function() {
Dropzone.options.myDropzone = {
init : function() {
var submitButton = document.querySelector("#submit-all")
myDropzone = this;
submitButton.addEventListener("click", function(e) {
e.stopPropagation();
e.preventDefault();
myDropzone.processQueue();
});
this.on("sendingmultiple", function() {
// Figure out what I want here or if I want at all
});
this.on("successmultiple", function(files, response) {
window.location.reload();
});
this.on("errormultiple", function(files, response) {
// Figure out what I want here or if I want at all
});
}
// Do I need this?
//myDropzone.on('success', myDropzone.processQueue.bind(myDropzone));
};
});
</script>
EDIT:
Теперь он работает после добавления http://в настройку URL. Но когда я загружаю файл, он добавляется в базу данных, но поле файла пустое. Многозначный показывает файл, когда я его распечатываю, но когда он сохраняется в базе данных, в поле файла ничего нет.
Когда я загружаю один файл, я получаю его в request.FILES:
<MultiValueDict: {u'file_upload[]': [<InMemoryUploadedFile: normal.PNG (image/png)>]}>
Когда я загружаю два, я получаю это в request.FILES:
<MultiValueDict: {u'file_upload[]': [<TemporaryUploadedFile: normal.PNG (image/png)>]}>
Несмотря на два файла, он показывает только один, но добавляет их как в базу данных (как без файлов, так и с идентификатором и датой создания). Также что такое TemporaryUploadedFile и InMemoryUploadedFile?
Он должен иметь индексы в файле u'file_upload [] ', когда я загружаю несколько, но это не так. У меня есть правильные настройки для загрузки кратных.
Но я не могу вывести их из MultiValueDict. И когда я пытаюсь что-то вроде:
for upload in request.FILES:
client_upload = ClientUpload.objects.create(client=current_client, file_upload=upload)
Я столкнулся с этой проблемой, когда панель администратора показывает идентификатор и время, но не файл. Это происходит при загрузке одного или нескольких файлов. Я не уверен, какая разница между InMemoryUploadedfile и TemporaryUploadedFile. Как я могу извлечь файлы из MultiValueDict? get() не работает, со списком comp я просто получаю пустой список.
Другая странная вещь, когда я загружаю определенные файлы, MultiValueDict пуст, а с другими - нет. Также кажется, что мое мнение вызывается более одного раза (в соответствии с выходами журнала), и это нормально, за исключением того, что он должен быть пост, а затем перенаправляться на get, но, похоже, имеет более одного почтового запроса. Я проверил инструменты dev в chrome, и я вижу только один, но, как ни странно, он выводит мой оператор журнала дважды каждый раз, когда я отправляю. Я знаю, что проблема, вероятно, на мой взгляд, но я пробовал массу вещей и не могу понять, что не так.
У кого-нибудь есть идеи?