اذهب إلى المحتوى

السؤال

نشر

لدي نموذج بسيط للغاية ويحتوي على حقل من نوع ImageField بالشكل التالي:

image = models.ImageField('image', upload_to='uploads/')

أريد أن أسمح للمستخدم بكتابة عنوان URL خاص بصورة موجودة على الإنترنت ثم تخزين هذه الصورة في هذا الحقل.

كيف أقوم بتخزين صورة online في هذا الحقل؟

أعتقد أنه يجب تحميل الصورة في كود جانغو Django ثم تخزينها في ملف ما، كيف أقوم بهذا الأمر؟

Recommended Posts

  • 1
نشر

نعم كما تفضلت يجب تحميلُ الصورة ثم تخزينها. يمكن إستعمال مكتبة requests لتحميلها على الشكل التالي:

from urllib.parse import urlparse
import requests
from django.core.files.base import ContentFile
from myapp.models import Photo

img_url = 'هنا ضع رابط الصورة'
name = urlparse(img_url).path.split('/')[-1] # جلب اسم الصورة من الرابط 
                                             # عادةً يكونُ اسم الصورة  هو آخر كلمة في الرابط

photo = Photo() # إنشاء كائن للنموذج

response = requests.get(img_url) # تحميل الصورة باستخدام  مكتبة requests
if response.status_code == 200: 
    # نحفظ الصورة في الحقل باستخدام الدالة
    # save
    photo.image.save(name, ContentFile(response.content), save=True)

أو يُمكن حفظ الصورة في ملف مؤقت قبل حفظها في النموذج:

from django.core.files import File
from django.core.files.temp import NamedTemporaryFile

photo = Photo()

photo.save()

# نحمل الصورة ونحفظها داخل ملف مؤقت من نوع
# NamedTemporaryFile
# باستعمال المكتبة 
# urlopen
image_url = 'هنا ضع رابط الصورة'
img_temp = NamedTemporaryFile(delete = True)
img_temp.write(urlopen(image_url).read())
img_temp.flush()

# نحفظ الصورة في النموذج
photo.image.save("image_%s" % photo.pk, File(img_temp))
photo.save() 

 

  • 1
نشر

الأمر بسيط حيث في البدايه

1 - يجب استدعاء تلك السطور في ملف models.py

from django.core.files import File
from urllib import request
import os 

بالعلم  أن السطر " import os " يمكن عدم استدعاؤه ( اختياري )

2 - يتم إنشاء class في ملف models.py كالمثال التالي :

class Item(models.Model):
    image_file = models.ImageField(upload_to='images')
    image_url = models.URLField()

- حيثُ أن image_file من نوع ImageField وهو الحقل الذي يتم رفع به الصوره بشكل تقليدي

و أن image_url من نوع URLField وهو يقبل إدخال الروابط فقط

3 - يتم تطبيق الفكره المُراد تطبيقها عن طريق كتابة الداله التاليه أسفل ال class الذي تم انشاؤه

 

def get_remote_image(self):
    if self.image_url and not self.image_file:
        result = request.urlretrieve(self.image_url)
        self.image_file.save(
                os.path.basename(self.image_url),
                File(open(result[0], 'rb'))
                )
        self.save()

حيثُ أن تلك الداله تهدف إلى جعل الأمر منطقياً من خلال معادله بسيطه تٌفيد بأنها في حال وجود ملف للصوره تم رفعه في خانة " image_file " يتم تنزيل الملف من الرابط المتواجد داخل خانة " image_url " و حفظها و اعتبارها هي الصوره الأساسيه

انضم إلى النقاش

يمكنك أن تنشر الآن وتسجل لاحقًا. إذا كان لديك حساب، فسجل الدخول الآن لتنشر باسم حسابك.

زائر
أجب على هذا السؤال...

×   لقد أضفت محتوى بخط أو تنسيق مختلف.   Restore formatting

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   جرى استعادة المحتوى السابق..   امسح المحرر

×   You cannot paste images directly. Upload or insert images from URL.

  • إعلانات

  • تابعنا على



×
×
  • أضف...