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)
发送包含文件的消息时出现问题。当您附上文件时,信件会附在邮件中。如果该字段是必填的似乎没问题,但如果该字段不是必填字段并且没有 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)