Django 1.11 发送文件表单(非必须)

Django 1.11 send file form (not required)

发送包含文件的消息时出现问题。当您附上文件时,信件会附在邮件中。如果该字段是必填的似乎没问题,但如果该字段不是必填字段并且没有 select 要发送的文件,那么这封信就不会寄到邮件中。 谁能告诉我如何解决这个问题?

观看次数:

if request.method == 'POST':
    file_form = FileForm(request.POST, request.FILES)
    if file_form.is_valid():
        f_name = file_form.cleaned_data['f_name']
        f_mail = file_form.cleaned_data['f_mail']
        f_message = file_form.cleaned_data['f_message']
        f_news = file_form.cleaned_data['f_news']
        f_file = request.FILES['f_file']
        news = ''
        if f_news:
            news = 'Посетитель дал согласие на получение новостей'
        d = {'f_name': f_name, 'f_mail': f_mail, 'news': news, 'f_message': f_message}
        htmly = get_template('mail/file.html').render(d)
        plaintext = get_template('mail/file.txt').render(d)
        from_email = 'dolgoletie.plastic@yandex.ru'
        to_email = [from_email, ]
        subject = 'Страничная форма c файлом'
        html_content = htmly
        text_content = plaintext
        try:
            mail = EmailMultiAlternatives(subject, text_content, from_email, to_email)
            mail.attach_alternative(html_content, "text/html")
            mail.attach(f_file.name, f_file.read(), f_file.content_type)
            mail.send()
        except:
            return HttpResponse('Invalid mail send!')
        return HttpResponseRedirect('/')
else:
    file_form = FileForm()

模型形式:

class FileForm(forms.Form):
f_name = forms.CharField(required=True, max_length=50)
f_mail = forms.EmailField(required=True)
f_message = forms.CharField(required=True, max_length=500)
f_file = forms.FileField(widget=forms.FileInput)
f_news = forms.BooleanField(required=False)

Html 表格:

<form class="form_question" role="form" method="post" action=" " {% if file_form.is_multipart %}enctype="multipart/form-data"{% endif %}>
{% csrf_token %}
    <div class="row_block">
        <label for="f_name">
            <span class="form_title">Ваше имя</span>
            <input type="text" name="f_name" placeholder="ФИО" required />
        </label>
        <span class="name_text">Для более точного ответа вы можете прикрепить фото, снимки УЗИ, анализ</span>
    </div>
    <div class="row_block">
        <label for="f_mail">
            <span class="form_title">Почта</span>
            <input type="text" name="f_mail" placeholder="Email" required />
        </label>
        <span class="upload_wrapper">
            <div class="fileform">
                <div class="selectbutton">Прикрепить файл</div>
                <input id="upload" type="file" name="f_file" required  />
            </div>
        </span>
    </div>
    <div class="row_block">
        <label for="f_message">
            <span class="form_title">Вопрос</span>
            <textarea name="f_message" id="textform" cols="30" rows="4"></textarea>
        </label>
        <span class="wrapper_checkbox">
            <input type="checkbox" name="f_news" id="checkbox" value="a1" checked />
            <label for="checkbox"></label>
            <strong>Подписаться на новости и акции</strong>
            <input type="submit" value="Отправить" id="button_submit">
        </span>
    </div>
</form>

再次。如果您删除了 required 而没有 select 文件,则消息不会出现。显然有必要描述处理过程。尝试了一个选项:

if 'f_file' in request.FILES:
    f_file = request.FILES['f_file']
    return f_file

但是我没有解决问题

解决了发送文件到邮件的问题:

f_file = request.FILES['f_file']

更改为:

f_file = request.FILES.get('f_file', False)

并在发货前添加验证:

if f_file:
    mail.attach(f_file.name, f_file.read(), f_file.content_type)