Oke, saya sudah mencoba hampir semuanya dan saya tidak bisa menyelesaikannya.
- Saya memiliki model Django dengan ImageField di atasnya
- Saya memiliki kode yang mengunduh gambar melalui HTTP (teruji dan berfungsi)
- Gambar disimpan langsung ke folder 'upload_to' (upload_to menjadi yang diatur di ImageField)
- Yang perlu saya lakukan adalah menghubungkan jalur file gambar yang sudah ada dengan ImageField
Saya telah menulis kode ini tentang 6 cara berbeda.
Masalah yang saya hadapi adalah semua kode yang saya tulis menghasilkan perilaku berikut: (1) Django akan membuat file ke-2, (2) mengganti nama file baru, menambahkan _ ke akhir file nama, maka (3) tidak mentransfer salah satu data dari meninggalkannya pada dasarnya file kosong yang diberi nama baru. Apa yang tersisa di jalur 'upload_to' adalah 2 file, satu yang merupakan gambar aktual, dan satu yang adalah nama gambar, tetapi kosong, dan tentu saja jalur ImageField diatur ke file kosong yang coba dibuat oleh Django untuk dibuat .
Jika tidak jelas, saya akan mencoba mengilustrasikan:
## 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
Bagaimana saya bisa melakukan ini tanpa Django mencoba menyimpan kembali file tersebut? Yang saya benar-benar suka adalah sesuatu untuk efek ini ...
model.ImageField.path = generated_image_path
... tapi tentu saja itu tidak berhasil.
Dan ya saya telah melalui pertanyaan-pertanyaan lain di sini seperti ini serta dokumen Django pada File
PEMBARUAN Setelah pengujian lebih lanjut, ini hanya melakukan perilaku ini ketika berjalan di bawah Apache pada Windows Server. Saat berjalan di bawah 'runserver' di XP itu tidak menjalankan perilaku ini.
Saya bingung.
Berikut adalah kode yang berjalan dengan sukses di XP ...
f = open(thumb_path, 'r')
model.thumbnail = File(f)
model.save()
sumber
Jawaban:
Saya memiliki beberapa kode yang mengambil gambar dari web dan menyimpannya dalam model. Bit penting adalah:
Itu agak membingungkan karena ditarik keluar dari model saya dan sedikit di luar konteks, tetapi bagian-bagian penting adalah:
Beri tahu saya jika Anda memiliki pertanyaan atau perlu klarifikasi.
Sunting: demi kejelasan, inilah modelnya (dikurangi pernyataan impor yang diperlukan):
sumber
import urlparse
.os.path.basename(urlparse.urlparse(self.url).path)
. Terima kasih atas posnya, sangat membantu.prohibited to prevent data loss due to unsaved related object 'stream'.
Sangat mudah jika model belum dibuat:
Pertama , salin file gambar Anda ke jalur unggah (diasumsikan = 'jalur /' dalam cuplikan berikut).
Kedua , gunakan sesuatu seperti:
diuji dan bekerja di Django 1.4, mungkin berhasil juga untuk model yang ada.
sumber
Hanya sedikit komentar. tvon answer berfungsi tetapi, jika Anda bekerja di windows, Anda mungkin ingin
open()
file tersebut'rb'
. Seperti ini:atau file Anda akan terpotong pada
0x1A
byte pertama .sumber
Berikut adalah metode yang berfungsi dengan baik dan memungkinkan Anda untuk mengonversi file ke format tertentu juga (untuk menghindari kesalahan "tidak dapat menulis mode P sebagai JPEG"):
di mana gambar adalah ImageField django atau your_model_instance.image di sini adalah contoh penggunaan:
Semoga ini membantu
sumber
Oke, jika yang perlu Anda lakukan adalah mengaitkan jalur file gambar yang sudah ada dengan ImageField, maka solusi ini mungkin membantu:
Nah, jika harus sungguh-sungguh, file gambar yang sudah ada tidak akan dikaitkan dengan ImageField, tetapi salinan file ini akan dibuat di upload_to dir sebagai 'imgfilename.jpg' dan akan dikaitkan dengan ImageField.
sumber
with open('/path/to/already/existing/file', 'rb') as f:
obj.save()
Apa yang saya lakukan adalah membuat penyimpanan sendiri yang tidak akan menyimpan file ke disk:
Kemudian, dalam model saya, untuk ImageField saya, saya telah menggunakan penyimpanan khusus baru:
sumber
Jika Anda hanya ingin "mengatur" nama file yang sebenarnya, tanpa mengeluarkan biaya pemuatan dan menyimpan kembali file (!!), atau menggunakan charfield (!!!), Anda mungkin ingin mencoba sesuatu seperti ini - -
Ini akan menerangi model_instance.myfile.url Anda dan yang lainnya seolah-olah Anda benar-benar mengunggah file tersebut.
Seperti kata @ t-stone, apa yang benar-benar kita inginkan, adalah untuk dapat mengatur instance.myfile.path = 'my-filename.jpg', tetapi Django saat ini tidak mendukung itu.
sumber
Solusi paling sederhana menurut saya:
sumber
Banyak jawaban ini sudah ketinggalan zaman, dan saya menghabiskan banyak waktu dalam frustrasi (saya cukup baru untuk Django & web dev pada umumnya). Namun, saya menemukan inti yang sangat bagus ini oleh @iambibhas: https://gist.github.com/iambibhas/5051911
sumber
Ini mungkin bukan jawaban yang Anda cari. tetapi Anda bisa menggunakan charfield untuk menyimpan path file alih-alih ImageFile. Dengan cara itu Anda dapat secara terprogram mengaitkan gambar yang diunggah ke bidang tanpa membuat ulang file.
sumber
Anda dapat mencoba:
sumber
sumber
sumber
Kerja! Anda dapat menyimpan gambar dengan menggunakan FileSystemStorage. periksa contoh di bawah ini
sumber
Anda dapat menggunakan kerangka Django REST dan Permintaan python pustaka untuk secara terprogram menyimpan gambar ke Django ImageField
Berikut ini sebuah Contoh:
sumber
Dengan Django 3, dengan model seperti ini:
jika gambar sudah diunggah, kita bisa langsung melakukan:
atau
sumber