2016-03-23 14 views
0

Ich versuche, Dateieingabe von einem HTML-Formular ohne Verwendung von Django Formular und dann anhängen diese Datei an E-Mail.Django - wie Dateieingaben ohne Verwendung von Django Formular zu erhalten und an die Datei anhängen

Mein HTML:

<form method="post" action="{% url 'foo' %}" enctype="multipart/form-data"> 
    <input type="file" name="file1"/> 
</form> 

Mein views.py:

def foo(request): 
    if not request.FILES['file1']: 
    return render(request, 'index.html', {}) 
    email_msg = EmailMessage(subject="email subject", body="email body", 
      from_email="[email protected]", to=["[email protected]"]) 
    email_msg.attach_file(request.FILES['file1']) 
    email_msg.send() 

    return render(request, 'needs-confirmation.html', context 

Ich habe zwei Fragen. Zuerst, in der Funktion foo, setze ich die if-Anweisung, um zuerst zu prüfen, ob der Benutzer die Datei abgelegt hat und dass file1 existiert. Dies funktioniert gut, wenn eine Datei als Datei1 hochgeladen wird, aber dies gibt einen Fehler, wenn Datei1 keine Dateieingabe hat. Wie kann ich überprüfen, ob Datei1 existiert oder nicht? Die zweite Frage ist, wenn ich Datei anhängen ich versucht, diesen Fehler email_msg, nicht attach_file Funktion nicht funktioniert, geben:

'InMemoryUploadedFile' object has no attribute 'replace' 

Wie kann ich Datei von HTML-Formular erhalten und die Datei an eine E-Mail anhängen? Danke.

Antwort

1

Der Code sollte wie folgt aussehen:

def foo(request): 
#need to check that form was submitted 
if request.method == "POST": 
    #this checks that a file exists 
    if len(request.FILES) != 0: 
     file1 = request.FILES['file1'] 
     file1str = file1.read() 
     file_type = str(request.FILES['file1'].content_type) 
     email_msg = EmailMessage(subject="email subject", body="email body", 
     from_email="...", to=["..."]) 
     #need to try to attach the file, using the attach method 
     try: 
      email_msg.attach('file1', file1str, file_type) 
     except Exception as e: 
      print(str(e)) 
     email_msg.send() 
return render(request, '/needs-confirmation.html', {}) 

Sie müssen wieder in den E-Mails füllen. Sie haben viele wichtige Schritte ausgelassen, und Ihr HTML benötigt eine Senden-Schaltfläche und crsf_token. Dies funktioniert für Textdateien, Sie müssen möglicherweise weitere Verarbeitungsschritte für andere Dateitypen ausführen.

Hoffe, das hilft.

Verwandte Themen