لرفع عدة ملفات عبر حقل نموذج في Django، يمكنك تعديل طريقة تعاملك مع حلقة الطلب في views.py لتتمكن من حفظ كل ملف بشكل منفصل. في حالتك، تستخدم مجال “files” لحفظ الملفات. لكن، عندما تستخدم form.save()
، يتم حفظ ملف واحد فقط. لحل هذه المشكلة، يجب عليك استخدام commit=False
للحصول على كائن النموذج قبل الحفظ وبعد ذلك تحفظ كل ملف بشكل منفصل. اليك كيفية تعديل views.py:
pythondef post_feed(request):
if request.method == 'POST':
form = FeedForm(request.POST, request.FILES)
if form.is_valid():
feed = form.save(commit=False)
feed.user = request.user
feed.pub_date = timezone.now()
feed.save()
# حفظ كل ملف بشكل منفصل
for file in request.FILES.getlist('files'):
feed.files.create(file=file)
return redirect('home')
else:
form = FeedForm()
return render(request, 'post_feed.html', {'form': form})
في هذا الكود، feed.files.create(file=file)
ينشئ كائن ملف جديد لكل ملف تم تحميله في النموذج ويربطه بكائن Feed الذي تم حفظه. تأكد من إضافة الرمز {% csrf_token %}
في نموذج الاستمارة في قالب HTML الخاص بك لتفادي الأخطاء المحتملة.
المزيد من المعلومات
بالطبع! إذا كنت تبحث عن مزيد من المعلومات حول رفع عدة ملفات في Django، فإليك بعض النقاط التي قد تجدها مفيدة:
-
استخدام
getlist
: في مثال الرمز الذي قدمته، استخدمتrequest.FILES.getlist('files')
للحصول على قائمة بجميع الملفات المحملة. هذا الأمر مهم لأن حقل الملف الذي يسمح برفع عدة ملفات (multiple=True
) يرسل ملفات متعددة، وعليك استخدامgetlist
لمعالجتها بشكل صحيح. -
تعيين معرف المستخدم: في الكود الذي قدمته، قمت بتعيين
feed.user
إلىUser.objects.get(pk=1)
، ولكن من الأفضل استخدامrequest.user
للحصول على معرف المستخدم المتواجد في الجلسة الحالية. -
إعادة توجيه بعد الحفظ: بعد حفظ البيانات بنجاح، يمكنك استخدام
return redirect('home')
لإعادة توجيه المستخدم إلى الصفحة الرئيسية أو أي صفحة أخرى تريدها. -
إضافة الرمز CSRF: تأكد من وجود
{% csrf_token %}
داخل نموذج الاستمارة في الصفحة الخاصة بك لحماية تطبيقك من هجمات Cross-Site Request Forgery (CSRF). -
إدارة التكرار: يجب عليك التأكد من إدارة التكرار بشكل صحيح في حلقة الطلب الخاصة بك. في الكود السابق، تم التعامل مع كل حالة بشكل منفصل لضمان حفظ جميع الملفات.
-
الاستجابة بعد الحفظ: بالنسبة لـ
success_url
، يجب عليك تحديد الصفحة التي ترغب في تحميلها بعد نجاح الحفظ. يمكنك تعيين قيمة لهذه المتغير بعد التوجه بنجاح.
إذا كنت بحاجة إلى مساعدة أو توضيح إضافي، فلا تتردد في سؤالي.