2017-12-05 1 views
0

Ich bin in der Lage, Fotos in den Medienordner hochzuladen. Mein Problem ist, dass ich sie beim Hochladen nicht in einem bestimmten Ordner speichern kann. Ich möchte, dass das Bild in einem eindeutigen Ordner gespeichert wird, basierend auf einer ID, die an die Django-Ansicht übergeben wird. Unten ist der Code, den folgenden Fehler führt:Django ImageField speichern an Standorten

views.py", line 90, in orderdetails settings.MEDIA_ROOT + '/orders/' + str(orderid) + '/' + image) TypeError: coercing to Unicode: need string or buffer, InMemoryUploadedFile found

if request.method == 'POST': 
    # Loop through our files in the files list uploaded 
    if not os.path.exists(settings.MEDIA_ROOT + '/orders/' + str(orderid)): 
     os.makedirs(settings.MEDIA_ROOT + '/orders/' + str(orderid)) 
    for image in request.FILES.getlist('files[]'): 
     # Create a new entry in our database 
     new_image = UploadedImages(client_order=client, image=image.name) 
     # Save the image using the model's ImageField settings 
     filename, ext = os.path.splitext(image.name) 
     new_image.image.save("%s-%s%s" % (filename, datetime.datetime.now(), ext), 
          settings.MEDIA_ROOT + '/orders/' + str(orderid) + '/' + image) 
     new_image.save() 

Wenn ich nur Bild verwenden es in den Medienordner finden spart gerade. Welcher ist der Code unten? Ich weiß, dass ich mit upload_to einen Ordner in meinem Modell eingerichtet habe. Trotzdem bin ich mir nicht sicher, wie ich es auf einen Ordner setzen soll, der auf dem ordierid basiert.

if request.method == 'POST': 
    # Loop through our files in the files list uploaded 
    if not os.path.exists(settings.MEDIA_ROOT + '/orders/' + str(orderid)): 
     os.makedirs(settings.MEDIA_ROOT + '/orders/' + str(orderid)) 
    for image in request.FILES.getlist('files[]'): 
     # Create a new entry in our database 
     new_image = UploadedImages(client_order=client, image=image.name) 
     # Save the image using the model's ImageField settings 
     filename, ext = os.path.splitext(image.name) 
     new_image.image.save("%s-%s%s" % (filename, datetime.datetime.now(), ext), image) 
     new_image.save() 

Antwort

0

Sie versuchen, eine Zeichenfolge und ein Dateiobjekt '/' + image

Sie wahrscheinlich den Namen der Datei hier wollen verketten, so versuchen '/' + image.name

, dass einige zusätzliche Pfadinformationen zurückgeben kann, so Sie müssten das entfernen, um nur den Dateinamen zu erhalten.

0

Nach einer Nacht der Suche konnte ich eine Lösung finden. Ich musste den Upload-Pfad mit einer dynamischen Funktion definieren und dann upload_to auf diese Funktion setzen.

def image_upload_path(instance, filename): 
    return settings.MEDIA_ROOT + '/orders/{0}/{1}'.format(instance.client_order.invoice, filename) 

class UploadedImages(models.Model): 
    ... 
    image = models.ImageField(upload_to=image_upload_path) 

Dadurch wurde mein Bildspeicherort an der richtigen Stelle gespeichert.