Я пытаюсь создать простое Django веб-приложение, которое при отправке двух изображений создает еще один файл изображения, в котором оба изображения располагаются одно рядом с другим (сценарий join_pics ()) ниже.
Для простоты я просто хочу получить загруженный файл, запустить сценарий и вернуть файл пользователю в качестве загрузки. Нет сохранения файлов на SQL или на сервер. Я знаю, что мне нужно проверить формат и размер файла, и т. Д. c. Все это решается с помощью JS и отказоустойчивого сценария Python (который будет реализован).
Проблема в том, что я не могу получить доступ к загруженным файлам. Я пробовал несколько методов, просматривал различные руководства и другие сообщения здесь, в StackOverflow и других сайтах, и т. Д. c.
Вот мой код:
# forms.py
class ThingyForm(forms.Form):
file1 = forms.CharField(label="file1", widget=forms.FileInput(), required=False)
file2 = forms.CharField(label="file2", widget=forms.FileInput(), required=False)
pwd1 = forms.CharField(label='Pwd1', max_length=32, widget=forms.PasswordInput(), required=False)
pwd2 = forms.CharField(label='Pwd2', max_length=32, widget=forms.PasswordInput(), required=False)
# views.py:
def thingy(request):
form = ThingyForm(request.POST or None, request.FILES or None)
if str(request.method) == 'POST':
if form.is_valid():
print('Form Validated.') # Just to know that
pwd1 = form.cleaned_data['pwd1'] #a password in case the user wants to zip the file with a password
pwd2 = form.cleaned_data['pwd2'] #the password is repeated in order to prevent typos
if pwd1 == pwd2:
file1 = form.cleaned_data['file1']
file2 = form.cleaned_data['file2']
if (str(file1) != '') and (str(file2) != ''):
messages.success(request, 'Procedure successful.')
c_file1 = request.FILES['file1'].read()
c_file2 = request.FILES['file2'].read()
join_pics(c_file1, c_file2, pwd1)
else:
messages.error(request, 'You must provide two files.')
else:
messages.error(request, 'The passwords do not match. Please reenter them.')
else:
print('Errors ' + str(form.errors))
messages.error(request, 'No bueno.')
context = {
'form': form
}
return render(request, 'thingy.html', context)
# urls.py:
from django.urls import path
from .views import index, thingy
urlpatterns = [
path('', index, name='index'),
path('thingy/', thingy, name='thingy'),
]
<!-- thingy.html: -->
{% load bootstrap4 %}
<!DOCTYPE html>
<html lang="en">
<head>
{% bootstrap_css %}
<meta charset="UTF-8">
<title>Thingy</title>
</head>
<body>
<div class="container">
<h1>He need some milk!</h1>
{% bootstrap_messages %}
<form action="{% url 'thingy' %}" method="post" class="form" autocomplete="off" enctype="multipart/form-data">
{% csrf_token %}
{% bootstrap_form form %}
{% buttons %}
<button type="submit" class="btn btn-primary">MakeItSo</button>
{% endbuttons %}
</form>
</div>
{% bootstrap_javascript jquery='full' %}
</body>
</html>
Когда я отправляю форму, я получаю следующую ошибку:
MultiValueDictKeyError at /thingy/
'message'
Request Method: POST
Request URL: http://localhost:8000/thingy/
Django Version: 3.0.8
Exception Type: MultiValueDictKeyError
Exception Value:
'message'
(...)
During handling of the above exception ('message'), another exception occurred:
\views.py in thingy
c_file1 = request.FILES['file1'].read()
Итак, насколько я понимаю, request.FILES не возвращает правильные данные. Однако я не знаю, что делать, чтобы использовать недавно загруженные файлы. Я новичок в Django и считаю, что опубликовал все, что нужно, чтобы помочь найти ошибку, но я был бы рад опубликовать больше кода, если это поможет.