في إطار Django Rest Framework، تتمكن من رفع ملف واحد بنجاح باستخدام المكتبة danialfarid/ng-file-upload. ولكن عند محاولة رفع ملفات متعددة، تواجهك مشكلة وتحصل على رسالة خطأ “No file was submitted.” على الرغم من أنك تقوم بإرسال الملفات بشكل صحيح.
لحل هذه المشكلة، يجب تغيير المراقبة والتسلسل بحيث يمكنهما التعامل مع رفع ملفات متعددة. سنقوم بتحديث الكود بالشكل التالي:
في ملف views.py:
pythonfrom rest_framework.parsers import MultiPartParser, FormParser
class PhotoViewSet(viewsets.ModelViewSet):
serializer_class = PhotoSerializer
parser_classes = (MultiPartParser, FormParser,)
queryset = Photo.objects.all()
def perform_create(self, serializer):
# تعديل ليتناسب مع رفع ملفات متعددة
serializer.save(blogs=Blogs.objects.latest('created_at'), images=self.request.data.getlist('image'))
تحتاج أيضًا لتغيير الموديل والسيريالايزر ليتعاملوا بشكل صحيح مع الرفع المتعدد. في ملف serializers.py:
pythonclass PhotoSerializer(serializers.ModelSerializer):
# استخدام SerializerMethodField للتعامل مع الرفع المتعدد
images = serializers.ListField(child=serializers.ImageField())
class Meta:
model = Photo
fields = ['blogs', 'images']
def create(self, validated_data):
images_data = validated_data.pop('images')
photo = Photo.objects.create(**validated_data)
for image_data in images_data:
PhotoImage.objects.create(photo=photo, image=image_data)
return photo
وفي ملف models.py، قم بإضافة موديل فرعي للصور:
pythonclass Photo(models.Model):
blogs = models.ForeignKey(Blogs, related_name='blogs_img')
class PhotoImage(models.Model):
photo = models.ForeignKey(Photo, related_name='images')
image = models.ImageField(upload_to=content_file_name)
هذه التعديلات ستمكنك من رفع ملفات متعددة بنجاح في Django Rest Framework. تأكد من استخدام المكونات الصحيحة وتهيئتها بشكل صحيح وفقاً لاحتياجاتك.
المزيد من المعلومات
بالطبع، لنواصل توضيح كيفية تنفيذ الرفع المتعدد للملفات في Django Rest Framework.
بمجرد تطبيق التغييرات المذكورة في الأكواد، ستتمكن الآن من رفع ملفات متعددة بنجاح باستخدام Django Rest Framework. لكن دعونا نفصل أكثر عن كيفية عمل هذه التغييرات.
أولاً، في ملف views.py، قمنا بتحديد parser_classes ليتضمن MultiPartParser و FormParser. هذا يسمح لعرض الفيو بقبول طلبات الرفع المتعددة من خلال تحليل بيانات الطلب بشكل صحيح.
ثم، في perform_create()، قمنا بتغيير كيفية حفظ البيانات. بدلاً من استخدام self.request.data.get() للحصول على ملف الصورة الواحد، قمنا باستخدام self.request.data.getlist() للحصول على قائمة بجميع ملفات الصور التي تم رفعها.
في serializers.py، قمنا بتغيير PhotoSerializer ليتضمن حقلًا جديدًا يُسمى “images” باستخدام serializers.ListField(child=serializers.ImageField())، حيث يقبل هذا الحقل قائمة من الصور. وعند استخدام create()، نقوم بفصل بيانات الصور عن بقية البيانات الموثقة وإنشاء كائن PhotoImage لكل صورة وتعيينه لكائن الصورة الأصلي.
أخيرًا، في models.py، قمنا بإنشاء موديل فرعي جديد يُسمى “PhotoImage” لتخزين الصور المرتبطة بكائن الصورة الأصلي. يُمكنك ربط هذا الموديل مع الموديل الرئيسي “Photo” باستخدام ForeignKey.
بتنفيذ هذه التغييرات، يمكنك الآن رفع ملفات متعددة بنجاح باستخدام Django Rest Framework. لا تنسَ دائمًا اختبار تطبيقك بشكل كامل بعد التغييرات للتأكد من عمل كل شيء بشكل صحيح. وإذا واجهت أي مشاكل، يُمكنك الرجوع إلى وثائق Django Rest Framework للمزيد من المساعدة والإرشاد.