البرمجة

رفع ملفات متعددة في Django Rest Framework

في إطار Django Rest Framework، تتمكن من رفع ملف واحد بنجاح باستخدام المكتبة danialfarid/ng-file-upload. ولكن عند محاولة رفع ملفات متعددة، تواجهك مشكلة وتحصل على رسالة خطأ “No file was submitted.” على الرغم من أنك تقوم بإرسال الملفات بشكل صحيح.

لحل هذه المشكلة، يجب تغيير المراقبة والتسلسل بحيث يمكنهما التعامل مع رفع ملفات متعددة. سنقوم بتحديث الكود بالشكل التالي:

في ملف views.py:

python
from 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:

python
class 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، قم بإضافة موديل فرعي للصور:

python
class 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 للمزيد من المساعدة والإرشاد.

زر الذهاب إلى الأعلى