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

السؤال

نشر

في مشروع جانغو Django الخاص بي، أسمح للمستخدمين برفع صورة شخصية ليتم عرضها في صفحة كل مستخدم، ولكن أريد أن أتأكد أن الملف المرفوع عبارة عن صورة وليس أي نوع آخر من الملفات، كيف أقوم بالتحقق من الملف في جانغو Django؟ أو هل توجد طريقة لجعل FileField يقبل نوع معين فقط من الملفات (صورة، فيديو ، صوت ، إلخ)؟

Recommended Posts

  • 1
نشر

يتوفر Django على حقل ImageField  هو عبارة عن FileField لكن يسمح فقط بحفظ الصور. لاستخدام هذا الحقل يجب تثبيت مكتبة بايثون Pillow. لتثبيتها نقوم ب:

pip install Pillow 

اما بالنسبة لطريقة استعمال ImageField  فهو على الشكل التالي:

field_name = models.ImageField(upload_to="uploads/", max_length=100)

حيث:

  • upload_to: هو مجلد حفظ الصور المُحَملة.

أما إذا أردت استخدام FileField لحفظ مجموعة مختلفة من أنواع الملفات بشرط أن تقوم بالتحقق منها قبل حفظها فهنا يُمكن أن نستعمل المُدَقِقْ validator.

المدقق التالي يقوم بالتحقق من نوع الملف:

import magic # نستخدم مكتبة بايثون ماجيك

from django.utils.deconstruct import deconstructible
from django.template.defaultfilters import filesizeformat

# نقوم بانشاء المدقق
@deconstructible
class FileValidator(object):
    error_messages = {
     'content_type': "Files of type %(content_type)s are not supported.",
    }

    def __init__(self, content_types=()):
        self.content_types = content_types

    def __call__(self, data):
        # content_types
        # هو المتغير الذي يقوم بتمرير أنوع الملفات المقبولة
        if self.content_types:
            content_type = magic.from_buffer(data.read(), mime=True)
            data.seek(0)
            
            # إذا كان نوع الملف  خارج القائمة نقوم بارسال خطأ
            if content_type not in self.content_types:
                params = { 'content_type': content_type }
                raise ValidationError(self.error_messages['content_type'],
                                   'content_type', params)

    def __eq__(self, other):
        return (
            isinstance(other, FileValidator) and self.content_types == other.content_types
        )

لاستعمال هذا المدقق:

#نحدد قائمة الملفات المسموحة
validate_file = FileValidator(content_types=('image/png', 'video/mp4', 'audio/wav'))
# نضيف المدقق للحقل
file = models.FileField(upload_to=settings.XML_ROOT,  validators=[validate_file])

 

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

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

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

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

  • إعلانات

  • تابعنا على



×
×
  • أضف...