Ok, ich habe fast alles ausprobiert und kann das nicht zum Laufen bringen.
- Ich habe ein Django-Modell mit einem ImageField
- Ich habe Code, der ein Bild über HTTP herunterlädt (getestet und funktioniert)
- Das Bild wird direkt im Ordner 'upload_to' gespeichert (der upload_to ist derjenige, der auf dem ImageField festgelegt ist).
- Ich muss lediglich den bereits vorhandenen Bilddateipfad mit ImageField verknüpfen
Ich habe diesen Code auf 6 verschiedene Arten geschrieben.
Das Problem, auf das ich stoße, ist, dass der gesamte Code, den ich schreibe, zu folgendem Verhalten führt: (1) Django erstellt eine zweite Datei, (2) benennt die neue Datei um und fügt am Ende der Datei ein _ hinzu Name, dann (3) keine der Daten übertragen, so dass es im Grunde eine leere umbenannte Datei bleibt. Was im Pfad 'upload_to' übrig bleibt, sind 2 Dateien, eine, die das eigentliche Bild ist, und eine, die den Namen des Bildes enthält, aber leer ist, und natürlich wird der ImageField-Pfad auf die leere Datei gesetzt, die Django zu erstellen versucht .
Falls das unklar war, werde ich versuchen zu veranschaulichen:
## Image generation code runs....
/Upload
generated_image.jpg 4kb
## Attempt to set the ImageField path...
/Upload
generated_image.jpg 4kb
generated_image_.jpg 0kb
ImageField.Path = /Upload/generated_image_.jpg
Wie kann ich dies tun, ohne dass Django versucht, die Datei erneut zu speichern? Was ich wirklich gerne hätte, ist etwas in diesem Sinne ...
model.ImageField.path = generated_image_path
... aber das funktioniert natürlich nicht.
Und ja, ich habe die anderen Fragen hier wie diese sowie das Django-Dokument in der Datei durchgesehen
UPDATE Nach weiteren Tests wird dieses Verhalten nur ausgeführt, wenn es unter Windows Server unter Apache ausgeführt wird. Während der Ausführung unter 'runserver' unter XP wird dieses Verhalten nicht ausgeführt.
Ich bin ratlos.
Hier ist der Code, der unter XP erfolgreich ausgeführt wird ...
f = open(thumb_path, 'r')
model.thumbnail = File(f)
model.save()
quelle
Antworten:
Ich habe einen Code, der ein Bild aus dem Web abruft und in einem Modell speichert. Die wichtigen Bits sind:
Das ist ein bisschen verwirrend, weil es aus meinem Modell herausgezogen und ein bisschen aus dem Kontext gerissen wurde, aber die wichtigen Teile sind:
Lassen Sie mich wissen, wenn Sie Fragen haben oder eine Klärung benötigen.
Bearbeiten: Aus Gründen der Übersichtlichkeit ist hier das Modell (abzüglich aller erforderlichen Importanweisungen):
quelle
import urlparse
.os.path.basename(urlparse.urlparse(self.url).path)
. Danke für den Beitrag, war hilfreich.prohibited to prevent data loss due to unsaved related object 'stream'.
Super einfach, wenn das Modell noch nicht erstellt wurde:
Erstens , kopieren Sie Ihre Image - Datei auf den Upload - Pfad (angenommen = ‚Pfad /‘ in folgenden Ausschnitt).
Zweitens verwenden Sie etwas wie:
getestet und funktioniert in Django 1.4, es könnte auch für ein vorhandenes Modell funktionieren.
quelle
Nur eine kleine Bemerkung. Die Antwort funktioniert, aber wenn Sie an Windows arbeiten, möchten Sie wahrscheinlich
open()
die Datei mit'rb'
. So was:oder Sie werden Ihre Datei beim ersten
0x1A
Byte abgeschnitten .quelle
Hier ist eine Methode, die gut funktioniert und es Ihnen ermöglicht, die Datei auch in ein bestimmtes Format zu konvertieren (um den Fehler "Modus P kann nicht als JPEG geschrieben werden" zu vermeiden):
Dabei ist das Bild das Django ImageField oder your_model_instance.image. Hier ist ein Verwendungsbeispiel:
Hoffe das hilft
quelle
Ok, wenn Sie lediglich den bereits vorhandenen Bilddateipfad mit ImageField verknüpfen müssen, ist diese Lösung möglicherweise hilfreich:
Wenn Sie es ernst meinen, wird die bereits vorhandene Bilddatei nicht mit ImageField verknüpft, aber die Kopie dieser Datei wird in upload_to dir als 'imgfilename.jpg' erstellt und mit ImageField verknüpft.
quelle
with open('/path/to/already/existing/file', 'rb') as f:
obj.save()
Was ich getan habe, war, meinen eigenen Speicher zu erstellen, der die Datei einfach nicht auf der Festplatte speichert:
Dann habe ich in meinen Modellen für mein ImageField den neuen benutzerdefinierten Speicher verwendet:
quelle
Wenn Sie nur den tatsächlichen Dateinamen "festlegen" möchten, ohne den Aufwand für das Laden und erneute Speichern der Datei (!!) oder die Verwendung eines Zeichenfelds (!!!) zu verursachen, möchten Sie möglicherweise Folgendes ausprobieren: - -
Dadurch werden Ihre model_instance.myfile.url und alle anderen so beleuchtet, als hätten Sie die Datei tatsächlich hochgeladen.
Wie @ t-stone sagt, wollen wir wirklich instance.myfile.path = 'my-filename.jpg' setzen können, aber Django unterstützt dies derzeit nicht.
quelle
Die meiner Meinung nach einfachste Lösung:
quelle
Viele dieser Antworten waren veraltet und ich verbrachte viele Stunden frustriert (ich bin ziemlich neu bei Django & Web Dev im Allgemeinen). Ich fand diesen hervorragenden Inhalt jedoch von @iambibhas: https://gist.github.com/iambibhas/5051911
quelle
Dies ist möglicherweise nicht die Antwort, nach der Sie suchen. Sie können jedoch charfield verwenden, um den Pfad der Datei anstelle von ImageFile zu speichern. Auf diese Weise können Sie hochgeladene Bilder programmgesteuert dem Feld zuordnen, ohne die Datei neu zu erstellen.
quelle
Du kannst es versuchen:
quelle
quelle
quelle
Arbeiten! Sie können Bilder mithilfe von FileSystemStorage speichern. Überprüfen Sie das folgende Beispiel
quelle
Sie können das Django REST-Framework und die Python Requests- Bibliothek verwenden, um Bilder programmgesteuert in Django ImageField zu speichern
Hier ist ein Beispiel:
quelle
Mit Django 3, mit einem Modell wie diesem:
Wenn das Bild bereits hochgeladen wurde, können wir direkt Folgendes tun:
oder
quelle