दिलचस्प पोस्ट
शब्दकोश में तत्वों का क्रम MPAndroidChart रेंडरर्स कैसे काम करते हैं और मैं एक कस्टम रेंडरर कैसे लिखूं? संबंधित आवृत्तियों / अनुपात के साथ dplyr एक चरित्र निरंतर में एकाधिक वर्ण Angularjs: 'नियंत्रक के रूप में नियंत्रक' और $ घड़ी PHP / MySQL का उपयोग कर सीएसवी डेटा आयात करना क्या नंबरों को इंटीजर्स में बदलने का कोई तरीका है? इस नियमित अभिव्यक्ति में ऋणात्मक दशमलव संख्याओं में मैं कैसे शामिल करूं? स्ट्रिंग का मूल्यांकन "3 * (4 + 2)" उपज 18 मैं एएसपी.नेट के साथ बटन टैग का उपयोग कैसे कर सकता हूं? पाठ फ़ाइल से पहली पंक्ति को पढ़ने के लिए विंडोज बैच कमांड लेआउटइन्फ़्लेटर अटैचट्रेट पैरामीटर क्या मतलब है? Rewrite मॉड्यूल का उपयोग कर पृष्ठों से .aspx को हटाने? एक पाश में टाइमआउट सेट करने के लिए फ़ंक्शन पास करना: हमेशा अंतिम मान? प्रतिबंधात्मक सामग्री सुरक्षा नीति के साथ पृष्ठ में आइफ्रेम इंजेक्शन

Django: छवि url से ImageField में छवि जोड़ें

कृपया मेरी बदसूरत अंग्रेजी 😉 के लिए क्षमा करें

यह बहुत सरल मॉडल की कल्पना करो:

class Photo(models.Model): image = models.ImageField('Label', upload_to='path/') 

मैं एक छवि यूआरएल से एक तस्वीर बनाना चाहूंगा (यानी, डीजेन्गो एडमिशन साइट में हाथ से नहीं)।

मुझे लगता है कि मुझे ऐसा कुछ करने की आवश्यकता है:

 from myapp.models import Photo import urllib img_url = 'http://www.site.com/image.jpg' img = urllib.urlopen(img_url) # Here I need to retrieve the image (as the same way that if I put it in an input from admin site) photo = Photo.objects.create(image=image) 

मुझे उम्मीद है कि मैंने इस समस्या को अच्छी तरह समझाया है, अगर मुझे न बताएं

धन्यवाद 🙂

संपादित करें:

यह काम कर सकता है लेकिन मुझे पता नहीं है कि डीजेंगो फ़ाइल में content कैसे परिवर्तित करें:

 from urlparse import urlparse import urllib2 from django.core.files import File photo = Photo() img_url = 'http://img.hiwab.com/python/default.jpg' name = urlparse(img_url).path.split('/')[-1] content = urllib2.urlopen(img_url).read() # problem: content must be an instance of File photo.image.save(name, content, save=True) 

वेब के समाधान से एकत्रित समाधान "Django: छवि url से ImageField में छवि जोड़ें"

मैंने इस समस्या के लिए http://www.djangosnippets.org/snippets/1890/ बनाया है। कोड पिथलेस रहित 'उत्तर के समान है, इसके अलावा यह urllib2.urlopen का उपयोग करता है क्योंकि urllib.urlretrieve डिफ़ॉल्ट रूप से कोई त्रुटि संभाल नहीं करता है इसलिए 404/500 पृष्ठ की सामग्री प्राप्त करना आसान है, जो आपको आवश्यक है। आप कॉलबैक फ़ंक्शन और कस्टम यूआरएल ओपरनर उपवर्ग बना सकते हैं लेकिन मुझे यह सिर्फ अपनी खुद की अस्थायी फाइल बनाने के लिए आसान पाया गया है:

 from django.core.files import File from django.core.files.temp import NamedTemporaryFile img_temp = NamedTemporaryFile(delete=True) img_temp.write(urllib2.urlopen(url).read()) img_temp.flush() im.file.save(img_filename, File(img_temp)) 
from myapp.models import Photo import urllib from urlparse import urlparse from django.core.files import File img_url = 'http://www.site.com/image.jpg' photo = Photo() # set any other fields, but don't commit to DB (ie. don't save()) name = urlparse(img_url).path.split('/')[-1] content = urllib.urlretrieve(img_url) # See also: http://docs.djangoproject.com/en/dev/ref/files/file/ photo.image.save(name, File(open(content[0])), save=True)
from myapp.models import Photo import urllib from urlparse import urlparse from django.core.files import File img_url = 'http://www.site.com/image.jpg' photo = Photo() # set any other fields, but don't commit to DB (ie. don't save()) name = urlparse(img_url).path.split('/')[-1] content = urllib.urlretrieve(img_url) # See also: http://docs.djangoproject.com/en/dev/ref/files/file/ photo.image.save(name, File(open(content[0])), save=True) 

ImageField सिर्फ एक स्ट्रिंग है, जो आपके MEDIA_ROOT सेटिंग के सापेक्ष पथ है बस फ़ाइल को सहेजें (आप पीआईएल का इस्तेमाल करके यह जांच कर सकते हैं कि यह एक छवि है) और उसके फ़ाइल नाम के साथ फ़ील्ड पॉप्युलेट करें।

तो यह आपके कोड से अलग है, जिसमें आपको अपने urllib.urlopen के आउटपुट को फाइल (अपने मीडिया स्थान के अंदर) में सहेजने की ज़रूरत है, पथ का काम करें, अपने मॉडल को बचाएं

मैं यह ऐसा पायथन 3 पर करता हूं, जो कि पायथन 2 पर सरल रूपांतरों के साथ काम करना चाहिए। यह मेरे ज्ञान पर आधारित है कि जिन फाइलों को मैं पुनः प्राप्त कर रहा हूं वे छोटी हैं। अगर तुम्हारा नहीं है, तो शायद मैं स्मृति में बफ़र के बजाए एक फ़ाइल में प्रतिक्रिया लिखने की सिफारिश करूँगा।

बाइटियो की आवश्यकता है क्योंकि डीजेंगो कॉल फाइल ऑब्जेक्ट पर () की तलाश करती है, और urlopen प्रतिक्रियाएं मांगने का समर्थन नहीं करती हैं आप बाइट ऑब्जेक्ट को पढ़ने के लिए () के बजाय Django की ContentFile पर भेज सकते हैं।

 from io import BytesIO from urllib.request import urlopen from django.core.files import File # url, filename, model_instance assumed to be provided response = urlopen(url) io = BytesIO(response.read()) model_instance.image_field.save(filename, File(io)) 

संयोजन करते हुए क्रिस एडम्स और स्टेन ने कहा था कि पायथन 3 पर काम करने के लिए चीजों को अपडेट करने के लिए, यदि आप अनुरोध स्थापित करते हैं तो आप ऐसा कुछ कर सकते हैं:

 from urllib.parse import urlparse import requests from django.core.files.base import ContentFile from myapp.models import Photo img_url = 'http://img.hiwab.com/python/image.jpg' name = urlparse(img_url).path.split('/')[-1] photo = Photo() # set any other fields, but don't commit to DB (ie. don't save()) response = requests.get(img_url) if response.status_code == 200: photo.image.save(name, ContentFile(response.content), save=True) 

Django के ContentFile दस्तावेज़ और अनुरोधों में अधिक प्रासंगिक डॉक्स 'फ़ाइल डाउनलोड उदाहरण।

यह सही और काम कर रहा है

 class Product(models.Model): upload_path = 'media/product' image = models.ImageField(upload_to=upload_path, null=True, blank=True) image_url = models.URLField(null=True, blank=True) def save(self, *args, **kwargs): if self.image_url: import urllib, os from urlparse import urlparse filename = urlparse(self.image_url).path.split('/')[-1] urllib.urlretrieve(self.image_url, os.path.join(file_save_dir, filename)) self.image = os.path.join(upload_path, filename) self.image_url = '' super(Product, self).save() 

यदि आप अपने डीजेंगो प्रोजेक्ट में फ़ाइल अपलोडिंग सुविधा का उपयोग कर रहे हैं, तो आपको सबसे पहले तकिया स्थापित करना होगा:

 pip install pillow==2.6.1 

Settings.py में मीडिया फ़ाइलों के लिए यूआरएल सेट करना याद रखें:

 MEDIA_ROOT = 'media/' 

उसके बाद, अपने models.py में, निम्न छवि फ़ील्ड जोड़ें:

 userlogo = models.ImageField(upload_to="userlogo/", blank=True, null=True) 

इस कोड को लिखने के बाद, इस मॉडल का उपयोग करके माइग्रेट करें:

 python manage.py makemigrations python manage.py migrate 

अब आप छवि फ़ील्ड का उपयोग करके छवि फ़ाइलों को अपलोड कर सकते हैं। छवि फ़ाइलों को YOUR_PROJECT_ROOT / मीडिया / उपयोगकर्ता लॉगो निर्देशिका में अपलोड किया जाएगा। आपको 'उपयोगकर्ता लॉगो' फ़ोल्डर मैन्युअल रूप से बनाने की आवश्यकता नहीं है।