Джанго: Как прикрепить файл, не ссылаясь на место назначения файла? - PullRequest
1 голос
/ 07 мая 2019

Я хочу прикрепить файл к электронному письму, который включает в себя весь контент, который пользователь вводит из контактной формы. В настоящее время я отсылаю PDF-файл, в котором записываются их данные, и прилагаю этот PDF-файл из места назначения файла. Однако я не знаю, как прикрепить дополнительные файлы, которые пользователь предоставляет в контактной форме. В этом случае это представляется как «msg.attach_file (upload_file)». Мои мысли:

  1. Загрузить файл в пункт назначения; однако каждый раз его нужно переименовывать в унифицированное имя, чтобы я мог обращаться к нему во время процесса прикрепления (msg.attach_file).

  2. Узнайте, как использовать request.FILES, чтобы прикрепить его немедленно, не беспокоясь о его имени файла или месте загрузки (я не уверен, является ли msg.attach_file допустимой командой для этого метода).

Есть ли правильный способ выполнить это действие? Я пытаюсь выполнить метод 2 с моим views.py файлом, который ссылается на мой файл forms.py, но он выдает ошибку.

Views.py

def quote_req(request):
submitted = False
if request.method == 'POST':
    form = QuoteForm(request.POST, request.FILES)
    company = request.POST['company']
    contact_person = request.POST['contact_person']
    upload_file = request.FILES['upload_file']
    description = 'You have received a sales contact form'
    if form.is_valid():
        data_dict = {
            'company_': str(company),
            'contact_person_': str(contact_person),
            }
        write_fillable_pdf(INVOICE_TEMPLATE_PATH, INVOICE_OUTPUT_PATH, data_dict)
        form.save()
        # assert false
        msg = EmailMessage('Contact Form', description, settings.EMAIL_HOST_USER, ['sample@mail.com'])
        msg.attach_file('/uploads/file.pdf')
        msg.attach_file(upload_file)
        msg.send(fail_silently=False)
        return HttpResponseRedirect('/quote/?submitted=True')
else:
    form = QuoteForm()
    if 'submitted' in request.GET:
        submitted = True

Журнал ошибок

TypeError at /quote/

expected str, bytes or os.PathLike object, not InMemoryUploadedFile

Request Method:     POST
Request URL:    http://www.mytestingwebsitesample.com/quote/
Django Version:     2.1.3
Exception Type:     TypeError
Exception Value:    

expected str, bytes or os.PathLike object, not InMemoryUploadedFile

Ответы [ 3 ]

0 голосов
/ 07 мая 2019

upload_file.read() вернет байты. Возможно, вы захотите попробовать attach вместо attach_file. attach_file требует, чтобы файл был сохранен в вашей файловой системе, в то время как вложение может принимать данные. Тем не менее, я считаю, что с attach вы сможете использовать request.FILES['upload_file'] напрямую.

https://docs.djangoproject.com/en/2.2/topics/email/#emailmessage-objects

0 голосов
/ 08 мая 2019

Я решил мою проблему, используя файл storage.py, который перезаписывает файлы с одинаковыми именами;в моем случае я загружаю каждый файл, переименовываю его в единое имя, а затем перезаписываю файл хранилища позже, а не добавляю расширение к имени файла с таким же заголовком.

0 голосов
/ 07 мая 2019

Можете ли вы попробовать следующее? Поскольку InMemoryUploadedFile не работает, возможно, придется сначала обработать его

upload_file = request.FILES['upload_file']
content = upload_file.read()
attachment = (upload_file.name, content, 'application/pdf')
# . . . 
msg.attach(attachment)
...