2017-04-17 17 views
1

添付ファイル付きのDjangoフォームで送信と電子メールを送信しようとしていますが、ファイルをローカルに保存せずに(ユーザーがアップロードした)送信できません。 私は自分のフォームを持っている:Djangoで添付ファイル付きの電子メールを送信する

class PrintForm(forms.Form): 
    contact_name = forms.CharField(required=True) 
    contact_email = forms.EmailField(required=True) 
    supervisor = forms.ChoiceField(
     choices=[(str(sup.email), str(sup.name)) for sup in Supervisors.objects.all()] 
    ) 
    file = forms.FileField() 
    content = forms.CharField(
     required=True, 
     widget=forms.Textarea 
    ) 

と私の見解:私は電子メールを送信していたときに

def print(request): 
    # context = dict() 
    # context['printers'] = Printer.objects.all() 
    # return render(request, 'threeD/print.html', context) 

    if request.method == 'POST': 
     form = PrintForm(data=request.POST, request = request) 

     if form.is_valid(): 
      contact_name = request.POST.get('contact_name', '') 
      contact_email = request.POST.get('contact_email', '') 
      form_content = request.POST.get('content', '') 
      supervisor = form.cleaned_data['supervisor'] 
      template = get_template('threeD/email/contact_template_for_printing.txt') 
      context = Context({ 
       'contact_name': contact_name, 
       'supervisor': supervisor, 
       'contact_email': contact_email, 
       'form_content': form_content, 
      }) 
      content = template.render(context) 
      subject = "New message" 

      try: 
       email = EmailMessage(
        subject, 
        content, 
        contact_email, 
        [supervisor], 
        headers={'Reply-To': contact_email} 
       ) 
       #email.attach(...) 
       email.send() 
      except: 
       return "Attachment error" 

      messages.success(request, "Thank you for your message.") 
      return redirect('/index/print/') 

    else: 
      form = PrintForm(request=request) 
    context_dict = {} 
    context_dict['printers'] = Printer.objects.all() 
    context_dict['form'] = form 
    return render(request, 'threeD/print.html', context_dict) 

だから私の見解では、メールにファイルを添付することになるemail.attach(file)を呼び出す方法がありますファイルをローカルに保存せずに送信しますか?ここ
iはフォームの呼び出しHTMLコードスニペット、次のとおりです:(フォームやビューは、ファイル機能を実装することなく、正常に動作します)

EDIT

<div class="panel-body"> 
     <form role="form" action="" method="post"> 
      {% csrf_token %} 
      {% load bootstrap %} 
       {{ form|bootstrap }} 

      <div class="text-center"> 
       <button type="submit" class="btn btn-primary"><span class="glyphicon glyphicon-send"></span> Send a message</button> 
      </div> 
     </form> 
</div> 

すべてのヘルプは非常に高く評価されるだろう。ありがとう!

答えて

0

このような何か:

def send_email(request): 
    ... 
    email = EmailMessage(
     subject, 
     content, 
     contact_email, 
     [to], 
     headers={'Reply-To': contact_email} 
    ) 
    if request.FILES: 
     uploaded_file = request.FILES['file'] # file is the name value which you have provided in form for file field 
     email.attach(uploaded_file.name, uploaded_file.read(), uploaded_file.content_type) 
    email.send() 
+0

はあなたの助けのためにありがとうございました。私が "file = forms.FileField()"と言うとき、私のフォームに何か間違っていますか?ビューに対するアプローチを使用するため、それでも作業は行われず、「このフィールドは必須です」というメッセージが表示されます。フィールドの近くには、たとえそれが添付されているような場合でも、 –

+0

フォームのHTMLコードを追加するためにあなたの質問を編集してください。 –

+0

私は自分のhtmlコードを追加しました。これは非常に原始的です。私は申し訳ありませんが、私はどのようにリクエストを取得するのか分からないことを恐れています。ファイルの値は、コントロールがビューに来るときに値です。 :/ –

関連する問題