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

السؤال

نشر

أحاول إعداد عملية رفع للملفات بحيث إذا قام المستخدم mohssen برفع ملف ما، فيتم حفظ الملف إلى المجلد MEDIA_ROOT/mohssen بدلاً من وضع كل الملفات في المجلد MEDIA_ROOT مباشرة. المشكلة هي أنني لا أعرف كيف أقوم بعمل هذا الأمر في النموذج. هنا الكود الخاص بي حاليًا:

class Post(models.Model):
    title = models.CharField(max_length=200)
    user = models.ForeignKey(User)
    thumbnail = models.FileField(upload_to='.')	# كيف أغير هذا المجلد ديناميكيًا

في الكود السابق سوف يتم رفع الملف إلى المجلد " . " ، ولكن كيف أقوم بتغير هذا المجلد حسب المستخدم بحيث يتم رفع الملف إلى مجلد باسم المستخدم نفسه؟

Recommended Posts

  • 1
نشر

يمكن الحفظ بأكثر من طريقة مثلا من form.py او view.py أو models.py 

فيما يلي طريقتين للحفظ من خلال models.py

def edit_path(instance, filename):
    """من الممكن ألا يعمل 
       username
       ويكون البديل هو
       user"""
 
    users_media = 'users' #يرجي العلم بأن جميع المستخدمين سيتم إنشائهم بداخل هذا المسار الفرعي ويمكن استبداله 
    return f'{users_media}/{instance.username}/{filename}'


class Post(models.Model):
    title = models.CharField(max_length=200)
    user = models.ForeignKey(User)
    thumbnail = models.FileField(upload_to=edit_path) #يتم استبدال مسار الحفظ بالدالة أعلاه

سيتم إنشاء مجلد أو مسار لكل مستخدم بداخل users وكل هذا بالطبع داخل المسار MEDIA_ROOT المعلن عنه في settings.py .

2:

هو استخدام دالة save الموجودة في models ,تابع التالي

from django.conf import settings
from django.core.files.base import File
import os


class Post(models.Model):
    title = models.CharField(max_length=200)
    user = models.ForeignKey(User)
    thumbnail = models.FileField(upload_to='users/')
    def save(self, *args, **kwargs):#يتم تنفيذ هذه الدالة مباشرة عند إجراء حفظ بيانات جديدة لهذا الجدول
        if self.user:
           name = self.user.username #الحصول على أسم المستخدم
           #إنشاء مسار جديد لهذا المستخدم في مسار الوسائط
           new_directory = os.path.join(settings.MEDIA_ROOT, 'users', name) 
           if not os.path.exists(new_directory):
              os.makedirs(new_directory)
           #قراءة الملف السابق 
           with open(thumbnail.path) as f:
                #ثم حفظه في المسار الجديد وتسجيل التغيير في الحقل المنشود
                self.thumbnail.save(os.path.join(new_directory,thumbnail.filename), File(f))
        return super(Post, self).save(*args, **kwargs)
      

تعتبر الطريقة الأولي هي الأفضل ولكن الطريقة الثانية قد تكون مفيدة وأكثر مرونة في حالات عدة من بينها إستخدام إجراءات أكثر داخل الجدول Post من تغيير قيمة حقول أخري في نفس اللحظة, إلي أخره.

موفقين

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

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

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

×   لقد أضفت محتوى بخط أو تنسيق مختلف.   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.

  • إعلانات

  • تابعنا على



×
×
  • أضف...