Django - Попросите пользователей подтвердить изменение PDF-файла
У меня вопрос по поводу Fileupload. У меня есть форма, где пользователи могут загружать PDF и изменять загруженные PDF. Когда они изменяют PDF, я хочу добавить предупреждение, прося их подтвердить изменение PDF. Подскажите, как лучше всего это сделать?
Прямо сейчас я пытаюсь решить эту проблему с помощью JS в моем HTML, например так:
<form enctype="multipart/form-data" method="post">
{% csrf_token %}
<table>
{{ form.as_table }}
</table>
<input type="submit" value="Submit">
<input class="deleter" type="submit" value="Delete">
{% include "some_html.html" %}
</form>
<script>
// Add event listener to change button
function confirmFileChange() {
var fileInput = document.getElementById('id_file');
fileInput.addEventListener('change', function() {
if (fileInput.value) {
if (!confirm('Are you sure you want to change the uploaded PDF?')) {
fileInput.value = '';
}
}
});
}
if (document.body.innerHTML.indexOf('Change: ') !== -1) {
confirmFileChange();
}
</script>
Но это также выводит предупреждение при первой загрузке, когда пользователь ничего не меняет.
Я предполагаю, что вы отображаете HTML в представлении django с помощью команды render(request, 'simple_upload.html')
.
Команда render принимает в качестве третьего параметра объект context, в котором можно хранить информацию, используемую в шаблоне. В этом контексте нужно написать, существует ли уже PDF или нет.
context = { 'pdf_already_exists': True if pdfAlreadyExists() else False }
render(request, 'simple_upload.html', context)
Теперь вы можете оценить в шаблоне, существует ли уже PDF-файл.
{% if pdf_already_exists %}
<script>
var fileInput = document.getElementById('id_file');
fileInput.addEventListener('change', function() {
if (fileInput.value) {
if (!confirm('Are you sure you want to change the uploaded PDF?')) {
fileInput.value = '';
}
}
});
</script>
{% endif %}
Сценарий отображается в HTML только тогда, когда PDF уже существует, и предупреждение не может быть показано при первой загрузке, когда пользователь ничего не меняет.
Надеюсь, это поможет.