Django Python: Получение имени загруженного файла и добавление его в тело сообщения электронной почты

Этот вопрос отличается от как получить имя загруженного файла в django, поскольку мне нужно добавить имя файла в тело сообщения электронной почты, и поскольку весь мой код отправки сообщения электронной почты и загрузки файла находится в views.py, я не использую файл models.py.

Как получить имя загруженного файла file и добавить его в часть сообщения f'{form_data["message"]}' электронного письма?

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

Я также знаю, что Django добавляет случайную строку символов к имени загружаемого файла, если видит существующий файл с таким же именем в каталоге загрузки, поэтому в этом случае мне нужно, чтобы имя файла было включено. С этим справляется file?

views.py

import smtplib
from email.mime.multipart import MIMEMultipart
from email.mime.text import MIMEText

from django.shortcuts import render, get_object_or_404, redirect

from django.core.files.storage import FileSystemStorage

from contactform.forms import ContactForm
from contact.settings import EMAIL_HOST_USER, EMAIL_PORT, EMAIL_HOST_PASSWORD, EMAIL_HOST

def thanks(request):
    return render(request, 'thanks.html', {})

def contact(request):
    if request.method == 'POST':
        form = ContactForm(request.POST,request.FILES)

        request_file = request.FILES['document'] if 'document' in request.FILES else None
        if request_file:
             fs = FileSystemStorage()
             file = fs.save(request_file.name, request_file)  // file name
             fileurl = fs.url(file)

        if form.is_valid():
            form_data = form.cleaned_data
            msg = MIMEMultipart()
            msg['From'] = EMAIL_HOST_USER
            msg['To'] = EMAIL_HOST_USER
            msg['Subject'] = f'Site Email'
            message = f'Name: {form_data["name"]}\n' \
                      f'Email address: {form_data["email_address"]}\n\n' \
                      f'{form_data["message"]}'         // Insert file name in message body?
            msg.attach(MIMEText(message))

            with smtplib.SMTP(EMAIL_HOST, EMAIL_PORT) as server:
                server.ehlo()
                server.starttls()
                server.login(EMAIL_HOST_USER, EMAIL_HOST_PASSWORD)
                server.sendmail(EMAIL_HOST_USER, EMAIL_HOST_USER, msg.as_string())

            return redirect('contactform:thanks')
    else:
        form = ContactForm()

    return render(request, 'contact.html', { "form": form })

Вы можете использовать request.FILES['filename'].name следующим образом:

msg['Message'] = f'Hi, You uploaded {request.FILES['filename'].name}. Thanks!' 

Вы можете использовать request.FILES.get('file_name').name следующим образом:

msg['Message'] = f'Hi, You uploaded {request.FILES.get('filename').name}. Thanks!'

Не забудьте добавить .get перед именем файла

Нет необходимости использовать другое поле msg; это работает. Все, что нужно, это file, поскольку file = fs.save(request_file.name, request_file) получает имя файла.

Это также добавляет правильное имя файла в сообщение, если Django добавил случайные символы для предотвращения перезаписи файлов с одинаковым именем:

message = f'Name: {form_data["name"]}\n' \
                      f'Email address: {form_data["email_address"]}\n\n' \
                      f'File Uploaded: {file}\n\n' \
                      f'{form_data["message"]}'
Вернуться на верх