Найти - Пользователи
Полная версия: Отправка файла через форму на почту
Начало » Python для новичков » Отправка файла через форму на почту
1
vitt44
Всем привет!
Есть такая проблема:
В форме есть поле добавления файла. Добавляем файл, отправляем письмо –> на почту все что нужно приходит. Но проблема в том, что если не добавить файл, то ничего не приходит )

Сама форма:
 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)

Представление:
 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 = 'Посетитель дал согласие на получение новостей'
            from_email = '###############'
            to_email = ['###########', ]
            subject = 'Страничная форма'
            full_message = "От %s ( %s ) %s. Сообщение: %s" %(f_name, f_mail, news, f_message)
            try:
                mail = EmailMessage(subject, full_message, from_email, to_email)
                if not f_file == None:  # Попытка проверки, но результата не дало
                    mail.attach(f_file.name, f_file.read(), f_file.content_type)
                mail.send()
            except:
                return HttpResponse('Invalid mail send!')
            return redirect(index)
    else:
        file_form = FileForm()

Кусок шаблона:
 <div class="block_left">
{% if file_form.is_multipart %}
  <form class="form_question" role="form" method="post" action=" " enctype="multipart/form-data">
{% else %}
  <form class="form_question" role="form" method="post" action=" ">
{% 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" />
      </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>
</div>

Убирал из формы шаблона:
<input id=“upload” type=“file” name=“f_file” /> (Так как по идее is_multipart обращает внимание type=“file” и соответственно выводит enctype=“multipart/form-data”)
И оставлял только: <form class=“form_question” role=“form” method=“post” action=“ ”> . Но отправка не происходит. Проверял это дело для того, что если бы без этих элементов заработало, то можно было бы задачу переложить на JS (при клике на див/кнопке добавления файла —> добавляются элементы input и enctype). Значит собака зарыта во вьюхе.

Подскажите как решить проблему
PEHDOM
vitt44
Сома форма:
чето сомеваюсь что это форма сома, но на всякий случай выложите еще метод is_valid() формы сома.

 f_file = forms.forms.FileField(widget = forms.FileInput)
и вот тут вы уверены что должно быть forms.forms.? МБ вы просто неудачно скопипастили?
vitt44
PEHDOM
и вот тут вы уверены что должно быть forms.forms.?

Опечатка здесь была. Подправил. Не в этом проблема )

PEHDOM
чето сомеваюсь что это форма сома, но на всякий случай выложите еще метод is_valid() формы сома.

Чего-то не понял, что имеете ввиду )
FishHook
vitt44
Чего-то не понял, что имеете ввиду )
Вам мягко намекают, что неплохо бы выучить русский язык перед тем как осваивать какие-то другие.
vitt44
FishHook
Вам мягко намекают, что неплохо бы выучить русский язык перед тем как осваивать какие-то другие.
Вот нет чтобы по делу ответить …
PEHDOM
vitt44
Чего-то не понял, что имеете ввиду )
сом это рыба такая.
+ смотрите у вас почта отправится если :
1. if request.method == ‘POST’: это условие выполняеться иначе вообще бы ничего не отправлялось никогда
2. if file_form.is_valid(): вернет True, что оно там проверяет мы не знаем, нужно посмотреть МБ оно проверет наличие аттача.
3. Ссработает написаное в секиции try: Иначе бы оно возвращало ‘Invalid mail send!’ . Я так понимаю оно не возвращает Invalid mail send! ? Если нет тогда остаеться проверять пункт 2.
FishHook
vitt44
Вот нет чтобы по делу ответить …
Я прямо и по делу ответил на ваш вопрос.
This is a "lo-fi" version of our main content. To view the full version with more information, formatting and images, please click here.
Powered by DjangoBB