2017-04-18 8 views
0

제 문제는 장고에있는 전자 메일을 보내는 동안 파일을 첨부하고 싶다는 것입니다.Django 전자 메일 첨부 메서드가 매개 변수를 올바르게 가져 오지 않았습니다

내가 그런 식으로 할 경우

email.attach("Random_name", uploaded_file.read()) 

작동하고 내 이메일을 보냅니다. 하지만 그 대신 문자열의 경우 "임의의 이름은"난으로 업로드 된 파일 이름을 나타내는이 변수를 넣어 : 모든 일이 불면

 uploaded_file = request.FILES['stl_file'] 
     uploaded_file_name = request.FILES['stl_file'].name 
     email.attach(uploaded_file_name, uploaded_file.read()) 

와 나는 ValueError를가 email.send은 "압축을 풀 1 개 이상의 값을 필요"취득() 메소드를 호출합니다. 나는 두 변수 upload_file과 upload_file_name (pdb 도구 사용)을 모두 확인했으며, 둘 다 attach 메소드를 호출하기 전에 올바른 값을 얻는다.

def print(request): 

    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" 

      email = EmailMessage(
        subject, 
        content, 
        contact_email, 
        [supervisor], 
        headers={'Reply-To': contact_email} 
      ) 
      if request.FILES: 
       uploaded_file = request.FILES['stl_file'] 
       uploaded_file_name = request.FILES['stl_file'].name 
       email.attach(uploaded_file_name, uploaded_file.read()) 
      email.send() 

      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) 

및 내 양식 :
여기에 내가 메일을 보내려고하고 내보기입니다

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()] 
    ) 
    stl_file = forms.FileField(required=False) 
    stl_file.help_text = "Upload your file as .STL format. If you have more than one file, " \ 
        "make a .zip and upload them all at once" 
    content = forms.CharField(
     required=True, 
     widget=forms.Textarea 
    ) 

그래서 내가 점점 오전 오류는 같다 : http://dpaste.com/2YZQ941
나는 것 어떤 도움을 주셔서 감사드립니다.
내가
마지막으로 같은, '응용 프로그램/octet-stream을'로 하드 codding 파일 형식에 의해 해결이 해결

버전 장고 1.9을 사용하고 있습니다 :

 uploaded_file = request.FILES['stl_file'] 
     uploaded_file_name = request.FILES['stl_file'].name 
     email.attach(uploaded_file_name, uploaded_file.read(), 'application/octet-stream') 
     email.send() 

답변

1

나는 그것이 필요하다고 생각 콘텐츠 유형, 아마도 이와 비슷한 것을 시도하십시오.

uploaded_file = form.cleaned_data.get('stl_file', '') 
email.attach(uploaded_file.name, uploaded_file.read(), uploaded_file.content_type) 
+0

감사합니다. 귀하의 의견에 감사드립니다. 글쎄, 나는 노력했다 - 그것은 효과가 없다. upload_file = form.cleaned_data.get (...)을 변경하면 파일을 첨부 할 때 " 'NoneType'객체에 'read'"라는 행이 있습니다. –

+0

장고에 stl_file이 없을 수도 있습니다. 그때 형태. FILES 요청이 작동한다면'uploaded_file = request.FILES [ 'stl_file']'과 같은 코드를 시도해보아야한다. 중요한 것은 콘텐츠 형식을 전달하는 것입니다. – davidejones

+0

Django 설명서에 콘텐츠 형식이 선택 사항이라고 나와 있습니다. 하지만 나는 그것을 넣으려고 시도 : email.attach (uploaded_file_name, uploaded_file.read(), uploaded_file_type), uploaded_file_type = request.FILES [ 'stl_file']. content_type (나는 변수를 pdb로 검사하여 값을 얻는다. 여전히 동일한 짜증나는 ValueError –