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

مسعود زاهي

الأعضاء
  • المساهمات

    646
  • تاريخ الانضمام

  • تاريخ آخر زيارة

  • عدد الأيام التي تصدر بها

    1

إجابات الأسئلة

  1. إجابة مسعود زاهي سؤال في كيفية إعادة التوجيه redirect إلى صفحات مخصصة بإستخدام المزخرف login_required في جانغو Django؟ كانت الإجابة المقبولة   
    عندما نٌريد حصر الوصول إلى URL ما فقط للمستخدمين المُسجلين نستخدم الزخرفة (decorator) login_required فوق الدالة ولإعادة توجيه المستخدم إلى صفحة تسجيل الدخول نقوم ب:
    إضافة LOGIN_URL إلى ملف الإعدادات الخاص بمشروعنا في Django LOGIN_URL='/path/to/url' #هنا أكتب رابط صفحة تسجيل الدخول  
    أو عن طريق تمرير قيمة login_url إلى الزخرفة login_required
    @login_required(login_url='أضف هنا رابط صفحة تسجيل الدخول') def my_view(request): ...  
    في حالة ما إذا كنا نستخدم صنف  (Class) كجانغو View
    class MyView(View): .... وأردنا حصر إستخدامها فقط للمستخدمين المسجلين يُمكننا استعمال LoginRequiredMixin على الشكل التالي:
    from django.contrib.auth.mixins import LoginRequiredMixin class MyView(LoginRequiredMixin, View): login_url = '/login/' #هنا نقوم بإضافة صفحة تسجيل الدخول  
  2. إجابة مسعود زاهي سؤال في كيفية إضافة صورة في حقل ImageField من خلال عنوان URL في جانغو Django؟ كانت الإجابة المقبولة   
    نعم كما تفضلت يجب تحميلُ الصورة ثم تخزينها. يمكن إستعمال مكتبة requests لتحميلها على الشكل التالي:
    from urllib.parse import urlparse import requests from django.core.files.base import ContentFile from myapp.models import Photo img_url = 'هنا ضع رابط الصورة' name = urlparse(img_url).path.split('/')[-1] # جلب اسم الصورة من الرابط # عادةً يكونُ اسم الصورة هو آخر كلمة في الرابط photo = Photo() # إنشاء كائن للنموذج response = requests.get(img_url) # تحميل الصورة باستخدام مكتبة requests if response.status_code == 200: # نحفظ الصورة في الحقل باستخدام الدالة # save photo.image.save(name, ContentFile(response.content), save=True) أو يُمكن حفظ الصورة في ملف مؤقت قبل حفظها في النموذج:
    from django.core.files import File from django.core.files.temp import NamedTemporaryFile photo = Photo() photo.save() # نحمل الصورة ونحفظها داخل ملف مؤقت من نوع # NamedTemporaryFile # باستعمال المكتبة # urlopen image_url = 'هنا ضع رابط الصورة' img_temp = NamedTemporaryFile(delete = True) img_temp.write(urlopen(image_url).read()) img_temp.flush() # نحفظ الصورة في النموذج photo.image.save("image_%s" % photo.pk, File(img_temp)) photo.save()  
  3. إجابة مسعود زاهي سؤال في كيفية التحقق من نوع الملف المرفوع في جانغو Django؟ كانت الإجابة المقبولة   
    يتوفر 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])  
  4. إجابة مسعود زاهي سؤال في كيفية تغير كلمة السر الخاصة بأحد المستخدمين في جانغو Django؟ كانت الإجابة المقبولة   
    توجد عدة طرقٍ لتغيير كلمة السر الخاصة بأحد المستخدمين من بينها:
    الطريقة الأولى: عن طريق جانغو shell: نقوم بفتح جانغو shell python manage.py shell داخل جانغو نقوم باستدعاء النموذج User  >>> from django.contrib.auth.models import User نقوم بجلب المستخدم الذي نريد تغيير رقمه السري: >>> my_user = User.objects.get(username="zahi")  لتغيير الرقم السري نستخدم الدالة set_password >>> my_user.set_password('_new_password_') #بعدها نحفظ التغييرات >>> user.save() 2. الطريقة الثانية: من خلال لوحة التحكم الخاصة بجانغو
    نقوم بالدخول إلى لوحة التحكم الخاصة بجانغو نذهب إلى AUTHENTICATION AND AUTHORIZATION ونختار النموذج User نُحَدد  اسم المستخدم الذي نُريد تغيير اسمه نضغط عليه تظهر لنا صفحة فيها معلومات المستخدم ومن بينها الرقم السري. الرقم السري يكون مشفر. لتغييره نجد جملة مكتوب فيها اذا اردت تغيير الرقم السري إضغط هنا. عند الضغط يظهر لنا نموذج لتغيير الرقم السري من غير ما نحط الرقم السري القديم.
  5. إجابة مسعود زاهي سؤال في ما هو أفضل مكان لوضع القوالب templates في مشروع جانغو Django؟ كانت الإجابة المقبولة   
    أفضل مكان لوضع القوالب هو داخل التطبيقات داخل مٌجلد اسمه templates حتى تكون هذه التطبيقات قابلة للإستعمال في مشروع آخر. أما عامةً فيُمكن وضع القوالب  أيضا داخل مجلد اسمه templates في جذر المشروع .
    يُرجى الذكر أنه يجب توفر الخاصية TEMPLATES في ملف الإعدادات حتى يعرف جانغو أين يقوم بالبحث عن القوالب.
    # داخل ملف settings.py TEMPLATES = [ { 'BACKEND': 'django.template.backends.django.DjangoTemplates', 'DIRS': [BASE_DIR / 'templates'], # مٌجلد القوالب العام 'APP_DIRS': True, # تفعيل خاصية البحث عن القوالب داخل التطبيقات ... }, ]  
  6. إجابة مسعود زاهي سؤال في كيفية تصفية كائنات نموذج model على أساس طول النص في جانغو Django؟ كانت الإجابة المقبولة   
    إبتداءًا من النسخة رقم 1.8 من جانغو يمكننا إستخدام الدالة Length والتي تقوم بنفس عمل الدالة LENGTH الموجودة في نظام قواعد البيانات. لاستخدام هذه الدالة للقيام بتصفية كائنات النموذج نقوم بالتالي:
    Model.objects.annotate(password_len=Length('password')).filter(password_len__gt=10) شرح الشفرة:
    قُمنا بإضافة حقل إلى ال QuerySet وسميناه password_len، هذا الحقل هو نتيجة حساب طول الحقل password باستخدام الدالة Length. قُمنا بتصفية ال QuerySet باستخدام عملية البحث gt والتي هي مختصر Greater than أي أكبر من.
  7. إجابة مسعود زاهي سؤال في خطأ RelatedObjectDoesNotExist في جانغو Django كانت الإجابة المقبولة   
    هذا بسبب أن ال ORM يقوم بالتحقق من وجود الكائن seller والكائن products في قاعدة البيانات، في حالة عدم وجود أحد منهم جانغو يقوم بالتنبيه بهذا الخطأ RelatedObjectDoesNotExist.
    لتجنب هذا الخطأ يجب تغيير الدالة has_related_object إلى ما يلي:
    def has_related_object(self): if hasattr(self, "seller") and hasattr(self, "products"): return (self.seller is not None) and (self.products is not None) return False الدالة hasattr تقوم بالتحقق من وجود الرابط بين الكائن من الصنف store مع الكائن seller ومع الكائن products.
    كما يمكننا أيضا إستخدام try .. catch لتفادي الخطأ قبل وُقوعه
    def has_related_object(self): try: return (self.seller is not None) and (self.products is not None) catch RelatedObjectDoesNotExist as e: pass return False  
  8. إجابة مسعود زاهي سؤال في كيف يمكنني تخطي اختبار unit test في جانغو Django؟ كانت الإجابة المقبولة   
    تحتوي الوحدة unittest في Python على مجموعة من الزخرفات (decorators) التي تسمح لك بتخطي إختبارٍ ما:
    الزخرفة skip: يُمكن إستخدامها مع الإختبارات الفردية: class MyTestCase(unittest.TestCase): @unittest.skip("demonstrating skipping") # نقوم بوضع الزخرفة فوق الدالة def test_nothing(self): self.fail("shouldn't happen")   أو مع مجموعة من الإختبارات تحت صنف واحد:
    @unittest.skip("showing class skipping") #نقوم بوضع الزخرفة فوق الصنف class MySkippedTestCase(unittest.TestCase): def test_not_run(self): pass الزخرفة skipIf: تعمل نفس عمل الزخرفة skip لكن إذا تحقق شرطٌ ما. class MyTestCase(unittest.TestCase): @unittest.skipIf(mylib.__version__ < (1, 3), "not supported in this library version") def test_format(self): # إختبار يعمل فقط في نسخ ذات إصدارات معينة pass كما يُمكنك إستخدام الزخرفة tag من الوحدة django.test والتي تسمح بوضع علامة على الإختبار حتى يقوم جانغو بتخطيه
    from django.test import tag class SampleTestCase(TestCase): @tag('fast') #علامة سريع def test_fast(self): ... @tag('slow') # علامة بطيئ def test_slow(self): ... @tag('slow', 'core') # علامات مختلفة def test_slow_but_core(self): ... لتخطي الإختبارات التي تحمل علامة معينة نقوم بتنفيذ الأمر:
    python manage.py test --exclude-tag=slow #مثلا تخطينا الإختبارات التي تحمل العلامة بطيئ  
  9. إجابة مسعود زاهي سؤال في كيفية إعادة التوجيه إلى عنوان URL مخصص بعد تسجيل الخروج في جانغو Django؟ كانت الإجابة المقبولة   
    نعم يُمكن التحكم في عنوان ال URL الذي يتم إعادة التوجيه إليه بعد تسجيل الخروج Logout سواءًا بإضافة المتغير LOGOUT_REDIRECT_URL إلى قائمة الإعدادات في ملف settings.py الخاص بالمشروع.
    # في ملف settings.py LOGOUT_REDIRECT_URL="هنا أكتب الرابط الذي تُريد إعادة التوجيه إليه أو إسم النمط" أو بإضافة المتغير next إلى عنوان ال URL لطلب تسجيل الخروج:
    <!-- غير path_to_the_page --> <!-- إلى الرابط الذي تريد --> <a href="{% url 'auth_logout' %}?next=/path_to_the_page"> Logout</a> كما يُمكن إعادة كتابة الدالة الخاصة بعمل تسجيل الخروج وإضافة HttpResponseRedirect لتوجيه العميل إلى الصفحة التي نُريد
    # ملف views.py from django.contrib.auth import logout @login_required def custom_logout(request): logout(request) # تسجيل الخروج return HttpResponseRedirect('/path_to_the_page') #إعادة توجيه #ملف urls.py urlpatterns = [ url(r'^logout/$', custom_logout, name='logout'), ] ملاحظة: المتغير LOGOUT_REDIRECT_URL تم إضافته إلى جانغو في النسخة رقم 1.10.
  10. إجابة مسعود زاهي سؤال في إستخدام مزخرفات التحقق validate decorators على أكثر من حقل في نفس الوقت في فلاسك Flask؟ كانت الإجابة المقبولة   
    قُم بترتيب الحقول على الشكل الموجود داخل النموذج بعدها قُم بفحص إذا كان الحقل الأخير هو الحقل الذي يتم التحقق من صحته، وإلا قم بإرجاع القيمة دون تحديد.
    @validates('password', 'repassword') def validates_fields(self, key, value): if key == 'repassword': if (self.password != value) { raise ValueError("Please make sure your passwords match.") } return value يكنك أيضا استخدام مُستمع أحداث للحدث before_flush للوصول إلى ما تبحث عنه:
    @event.listens_for(Session, 'before_flush') def validate_passwords(session, flush_context, instances): """ """ for instance in session.new: if isinstance(instance, MyData): if instance.password != instance.repassword raise ValueError("Please make sure your passwords match.")  
  11. إجابة مسعود زاهي سؤال في ما الفرق بين عبارات الاستيراد settings و django.conf.settings في تطبيق جانغو Django؟ كانت الإجابة المقبولة   
    import settings سيقوم باستيراد أول ملف بايثون باسم settings.py موجود في المسار sys.path. عادةً يكون هذا الملف هو ملف الإعدادات الخاص بمشروع Django. وهذا الملف يحِلُّ محل ملف الإعدادات الإفتراضية الخاص ب Django والموجود في django.conf.global_settings.
    أما بالنسبة ل:
    from django.conf import settings هو ليسَ ملفاً وإنما كائن تابع للنموذج  LazySettings كما هو موضح في شفرة المصدر الخاص بجانغو
    settings = LazySettings() هذا الكائن يقوم بجمع كل الإعدادات سواءًا الافتراضية (الخاصة بجانغو) أو الخاصة بالمشروع وعمل ملخص منها. هذا الملخص يكون أَعَم وأَشمل من  الإستيراد الأول.
    تُستخدم الطريقة الثانية أيضا في حالة ما إذا كنا نملك ملفين للإعدادات. الملف الأول مثلا ملف إعدادات التطوير settings_dev.py والملف الثاني ملف إعدادات الإنتاج settings_prod.py فهو يقوم باستيراد إعدادات الملف الذي نقوم بتنفيذ المشروع به.
  12. إجابة مسعود زاهي سؤال في كيفية إستخدام Redis في مشروع جانغو Django؟ كانت الإجابة المقبولة   
    Redis هو عبارة عن مَخزَن قيم مفاتيح key value store مفتوح المصدر يمكنه العمل كمخزن لتخزين البيانات في الذاكرة in-memory store أو كمخزن تخزين بيانات مؤقت. يُمكن استخدامه إمّا كخادوم قاعدة بيانات لوحده أو مرتبطًا مع قاعدة بيانات أخرى مثل MySQL لتسريع بعض الأشياء.
    يتم إستخدام Redis مع Django كذاكرة تخزين مؤقت cache لتخفيف الحمل الزائد على عمليات الاستعلام queries التي تتم على قاعدة البيانات المُستخدمة.
    إنطلاقا من النسحة رقم 4.0 لجانغو أصبح التخزين المؤقت باستخدام Redis من الأمور المُدمجة والمدعومة بعد أن كان عبارة عن تطبيق طرف ثالث.
    لاستعمل Redis مع جانغو نحتاجُ أولاً إلى تثبيت الخادم الخاص به. ندخل إلى  الموقع الرسمي ونقوم بتثبيته على حسب النظام الذي نستخدمه.
    بعد تثبيت Redis سنحتاج إلى تثبيت redis-py وهي مكتبة في بايثون تقوم بالربط مع الخادم.

    لاستخدام Redis كخلفية لذاكرة التخزين المؤقت مع Django نقوم ب:
    في ملف الإعدادات settings.py نضيف django.core.cache.backends.redis.RedisCache. CACHES = { 'default': { 'BACKEND': 'django.core.cache.backends.redis.RedisCache', 'LOCATION': 'redis://127.0.0.1:6379', # هنا ضع عنوان الايبي مع المنفذ الخاص بالخادم # redis } } عادة ما يكون Redis محمياً باسم مستخدم وكلمة مرور نضيفهما إلى عنوان URL: CACHES = { 'default': { 'BACKEND': 'django.core.cache.backends.redis.RedisCache', 'LOCATION': 'redis://username:password@127.0.0.1:6379', } } إذا كنا نملك عدة خوادم Redis تم إعدادها في وضع النسخ المتماثل (replication)، فيمكننا إضافتها على الشكل التالي: CACHES = { 'default': { 'BACKEND': 'django.core.cache.backends.redis.RedisCache', 'LOCATION': [ 'redis://127.0.0.1:6379', # القائد 'redis://127.0.0.1:6378', # النسخة رقم 1 'redis://127.0.0.1:6377', # النسخة رقم 2 ], } } هكذا نكون قد أتممنا إضافة Redis إلى جانغو.
    للإستزادة من المعلومات يمكن الإطلاع على المقالات التالية الموجودة في أكاديمية حسوب:
     
  13. إجابة مسعود زاهي سؤال في متى أستعمل save(commit=False) في جانغو Django؟ كانت الإجابة المقبولة   
    عند إستعمال save مع commit=False  الكائن المُعاد من الدالة لن يُحفظ في قاعدة البيانات عكس الأمر عند إستخدام commit=True الكائن سوف يٌحفظ وبعدها يُعاد. يكون هذا الفعل مٌفيداً عندما نٌريد إجراء مُعالجة إضافية للكائن قبل  حفظه في قاعدة البيانات.
    كمثال تطبيقي، نفرض أننا نملك نموذجاً حيثُ يكون عنوان البريد الالكتروني واسم المستخدم  مُتماثلين دائما في هذه الحالة عند رسم النموذج نقوم بوضع حقل واحد خاص بالبريد الإلكتروني مثلاً وعند حفظ النموذج نُعبئ حقل اسم المستخدم بنفس القيمة.
    class UserForm(forms.ModelForm): ... def save(self): # نقوم بتمرير #commit=False # للنموذج # الكائن المُعاد # لا يكون محفوظا في قاعدة البيانات في هذه اللحظة user = super(UserForm, self).save(commit=False) # "هنا نجعل قيمة "اسم المستخدم" هي نفس قيمة "البريد الالكتروني user.username = user.email # هنا يتم الحفظ user.save() return user عكس ما إذا استخدمنا commit=True فإن الكائن سوف يٌحفظ في قاعدة البيانات قبل أن نقوم بوضع قيمة "اسم المستخدم".
  14. إجابة مسعود زاهي سؤال في حذف كل الجداول من قاعدة البيانات في جانغو Django؟ كانت الإجابة المقبولة   
    python3 manage.py sqlflush blog الأمر الذي استعملته هنا يقوم فقط بطباعة مجموعة أوامر بصيغة SQL، هذه الأوامر تعمل على حذف البيانات فقط ولا تحذف الجداول الخاصة بالتطبيق blog.
    إذا أردت حذف بيانات التطبيق blog فقط قُم بدمْج الأمر السابق مع الأمر dbshell:
    pyhon3 manage.py sqlflush blog | python3 manage.py dbshell الأمر dbshell وظيفته فتح ال shell الخاص بقاعدة البيانات.
    أما إذا أردت حذف كل بيانات التطبيقات استعمل الأمر 
    python3 manage.py flush # أو django-admin flush أما إذا أردت حذف الجداول مع البيانات قم بتنفيذ الشفرة التالية في django shell
    python3 manage.py shell #نقوم بفتح django shell #نقوم بتنفيذ أوامر الحذف داخل قاعدة البيانات >>> from django.db import connection >>> cursor = connection.cursor() >>> cursor.execute('show tables;') >>> parts = ('DROP TABLE IF EXISTS %s;' % table for (table,) in cursor.fetchall()) >>> sql = 'SET FOREIGN_KEY_CHECKS = 0;\n' + '\n'.join(parts) + 'SET FOREIGN_KEY_CHECKS = 1;\n' >>> connection.cursor().execute(sql)  
  15. إجابة مسعود زاهي سؤال في كيفية إيقاف ميزة expire_on_commit في SQL-Alchemy في فلاسك Flask؟ كانت الإجابة المقبولة   
    لتعطيل expire_on_commit في SQL-Alchemy نقوم بإضافة المتغير session_options عند إنشاء كائن قاعدة البيانات فهو يسمح بتمرير الإعدادات إلى كل عناصر Session التي سوف تٌنشأ
    db = SQLAlchemy(app, session_options={"expire_on_commit": False})  
  16. إجابة مسعود زاهي سؤال في ما الفرق بين DoesNotExist و ObjectDoesNotExist في جانغو Django؟ كانت الإجابة المقبولة   
    DoesNotExist و ObjectDoesNotExist  هما عبارة عن أخطاء (exceptions) في جانغو تحدث عندما نريد جلب كائن من قاعدة البيانات لكن هذا الكائن غير متوفر إما لأنه حُذف أو لأن المُعرف الذي استخدمناه كان خاطئاً.
    في فرق بسيط بينهما وهو أن ObjectDoesNotExist عامة و DoesNotExist خاصة. لفهم هذا نقوم بالمثال التالي:
    from django.contrib.auth.models import User from django.core.exceptions import ObjectDoesNotExist from myproject.apps.teams.models import Team try: user = User.objects.get(pk=1337) team = Team.objects.get(pk=23) except ObjectDoesNotExist: logging.error("المستخدم أو الفريق لا يوجد") في المثال السابق قُمنا بجلب كائن من النموذج User باستخدام المعرف 1337، و كائن من النموذج Team باستخدام المعرف 23.
    لو صودف أن أحد الكائنين غير متوفر سيحدث الخطأ ObjectDoesNotExist.
    لو أردنا أن نَفْصِل بين الخطأين مثلاً:  عندما لا نجد المستخدم نسجل "المستخدم لا يوجد" وعندما لا نجد الفريق نكتب " الفريق لا يوجد" هنا لا نستطيع فعل ذلك باستخدام ObjectDoesNotExist فنستعمل DoesNotExist.
    from django.contrib.auth.models import User from myproject.apps.teams.models import Team try: user = User.objects.get(pk=1337) team = Team.objects.get(pk=23) except User.DoesNotExist: logging.error("المستخدم غير موجود") except Team.DoesNotExist: logging.error("الفريق غير موجود")  
  17. إجابة مسعود زاهي سؤال في ما هو الكائن g في فلاسك Flask؟ كانت الإجابة المقبولة   
    شرح الشفرة:
    app.before_request: تقوم بتسجيل الدالة ليتم تشغيلها عند بداية كل طلب (request) في مثالك قامت بتسجيل الدالة before_request. app.teardown_request: تقوم بتسجيل الدالة ليتم تشغيلها عند نهاية كل طلب (request) في مثالك قامت بتسجيل الدالة teardown_request.
    g هو كائن يوفره Flask. هو عبارة عن كائن شامل تحفظ فيه أي بيانات تريدها أثناء سياق طلب واحد. في المثال الذي طرحته قُمت بالاحتفاظ بوقت البداية  g.start = time.time() والذي قُمت باستخدامه لاحقاً في الدالة teardown_request  لحساب الفرق بين وقت البداية والنهاية
    diff_time = time.time() - g.start ملاحظة:
    g كائن يعيش بين app.before_request و بين app.teardown_request اي في سياق التطبيق (the application context) يعني هذا أن g يختلف من طلب لآخر.
     
  18. إجابة مسعود زاهي سؤال في كيفية دمج أكثر من QuerySet معًا في جانغو Django؟ كانت الإجابة المقبولة   
    الطرق المختلفة لدمج مجموعتي بحث (QuerySet):
    مجموعتا البحث من نفس النموذج Model:  توجد عدة طرق لدمج مجموعتي بحث من نفس النموذج باستخدام رمز الأنبوب (Pipe) | : # q1, q2 and q3 لنفرض لدينا مجموعات البحث التالية # للدمج بين كل المجموعات نستخدم combined_result= q1 | q2 | q3  
    باستخدام itertools: توفر itertools طريقة تسلسلية تسمح لك بسهولة الجمع بين مجموعتين أو أكثر من مجموعات البحث من نفس النماذج أو نماذج مختلفة.
    from itertools import chain combined_list = list(chain(q1,q2))  
    مجموعتا البحث من نماذج مختلفة: 
    باستخدام الدالة union: تقوم هذه الدالة باستخدام UNION الخاص ب SQL لدمج مجموعتين أو أكثر :
    qs1.union(qs2, qs3)  
  19. إجابة مسعود زاهي سؤال في ما هو المطلوب لتشغيل تطبيق Flask على صفحات GitHub؟ كانت الإجابة المقبولة   
    صفحات GitHub مخصصة للمواقع الثابتة فقط — المواقع التي تم إنشاؤها باستخدام HTML و CSS و JS. لا يدعم المواقع التي تم إنشاؤها باستخدام Python أو .NET أو PHP أو لغات أخرى من جانب الخادم. ستحتاج إلى العثور على مضيف ويب بديل إذا كنت بحاجة إلى استضافة موقع مكتوب بإحدى هذه اللغات أو كنت بحاجة إلى مضيف قاعدة بيانات.
    من أشهر مواقع الاستظافة المجانية والتي تدعم لغة بايثون نجد:
    موقع pythonanywhere. موقع heroku.  
  20. إجابة مسعود زاهي سؤال في كيفية الحصول على عنوان URL الحالي في جانغو Django؟ كانت الإجابة المقبولة   
    توجد طريقتين للوصول إلى ما ترغب به:
    الطريقة الأولى:
    استخدم {{request.path}} داخل القالب (Template)، ستقوم بإرجاع الرابط (URL) الخاص بالصفحة التي أنت فيها ، ثم قم بالتحقق من أنه يساوي القيمة التي أنت تريدها باستخدام أداة الشرط IF على الشكل التالي: <a href="/signin" class="{% if request.path == '/signin' %} active {% endif %}">Signin</a> <a href="/signup" class="{% if request.path == '/signup' %} active {% endif %}">Signup</a> <a href="/" class="{% if request.path == '/' %} active {% endif %}">Home</a> الطريقة الثانية:
    قُم بإنشاء متغيرات داخل دوال كل رابط، وهذه المتغيرات قم بارسالها للقالب عند عرضه.  def signup_view(request): .... #قم بإنشاء المتغير #signup_page #وإرساله إلى القالب return render(request, "signup_template.html", {"sigup_page": True}) def signin_view(request): .... return render(request, "signup_template.html", {"signin_page": True}) def home_view(request): .... return render(request, "signup_template.html", {"home_page": True}) بعدها استخدم المتغيرات في القالب:
    <a href="/signin" class="{% if signin_page %} active {% endif %}">Signin</a> <a href="/signup" class="{% if signup_page %} active {% endif %}">Signup</a> <a href="/" class="{% if home_page %} active {% endif %}">Home</a>  
  21. إجابة مسعود زاهي سؤال في خطأ Address already in use عند تشغيل مشروع فلاسك Flask كانت الإجابة المقبولة   
    الخطأ  Address already in use يظهر عادة لما يكون يكون المنفذ (Port) - في مثالك 8080 أو قيمة مسجلة داخل متغيرات النظام - مستخدمًا بالفعل من قبل بعض تطبيقات بايثون الأخرى أو أي تطبيق آخر.
    لإصلاح الخطأ قُم باختيار منفذ آخر لتطبيقك:
    app.run(host = os.getenv('IP', '0.0.0.0'), port=8088)# مثلا 8088 إذا كنت تريد رؤية البرنامج الذي يشغل هذا المنفذ استخدم الأمر: (لمستخدمي linux )
    netstat -ntlp | grep 8080 والذي بدوره يقوم بالكشف عن التطبيق الذي يشغل المنفذ. مثلاً:
    Proto Recv-Q Send-Q Local Address Foreign Address State PID/Program name tcp 0 0 127.0.0.1:8080 0.0.0.0:* LISTEN 6599/python قم بإنهائه باستخدام
    kill -9 PID #أي kill -9 6599  
  22. إجابة مسعود زاهي سؤال في كيف أحصل على آخر كائن في النموذج في جانغو Django؟ كانت الإجابة المقبولة   
    يوجد خطأ في الشفرة
    User.objects.filter(name="mohssen").latest() الدالة latest تُرجع آخر كائن في من النموذج بناءً على حقل أم مجموعة حقول مثلاً:
    #آخر كائن بناءً على المعرف Entry.objects.latest('id') #آخر كائن بناءً على حقلين المعرف وتاريخ الإنشاء Entry.objects.latest('id', '-creation_date') فللحصول على آخر كائن من نموذج Django استعمل الدالة last:
    last_user = User.objects.last() #بعد الفلترة last_user_with_name_mohssen = User.objects.filter(name="mohssen").last() أما إذا أردت استعمال latest فعليك إختيار الحقل المُناسب: مثلا تاريخ الإنشاء، أو استعمل المُعَرف
    last_user = User.objects.latest('id') #بعد الفلترة last_user_with_name_mohsen = User.objects.filter(name="mohssen").latest('id')  
  23. إجابة مسعود زاهي سؤال في  كيف يمكنني الحصول على اسم جدول قاعدة البيانات من النموذج Model برمجيًا في جانغو Django؟ كانت الإجابة المقبولة   
    لكي تحصل على اسم جدول النموذج داخل قاعدة البيانات يُمكنك استعمال:
    from django.contrib.auth.models import User User.objects.model._meta.db_table #أو استعمل User._meta.db_table # أما اذا كنت تريد الوصول الى اسم الجدول من الكائن مباشرة استخدم # مثلا اسم الكائن هو # my_user my_user._meta.db_table  
  24. إجابة مسعود زاهي سؤال في خطأ database is locked في جانغو Django؟ كانت الإجابة المقبولة   
    من المفترض أن تكون SQLite قاعدة بيانات خفيفة ، وبالتالي لا يمكنها دعم مستوى عالٍ من التزامن.
    OperationalError: database is locked  يُشير هذا الخطأ إلى أن التطبيق الخاص بك يُواجه التزامن أكثر من أن يتمكن SQLite التعامل معها.
    تحتوي مكتبة SQLite في Python على قيمة مُهلة افتراضية تٌحَدد المدة التي يُسمح فيها لمؤشر الترابط الثاني بالانتظار على القفل قبل إنهاء مهلته وإثارة الخطأ OperationalError: database is locked.
    يُمكنك حل هذا الخطأ عن طريق:
    التبديل إلى قاعدة بيانات أُخرى. عندَ نقطة معينة يصبح SQLite جدا "لايت" لتطبيقات العالم الحقيقي، وهذه الأنواع من الأخطاء تُشير إلى أنك قد وصلت إلى هذه النقطة. إعادة كتابة التعليمات البرمجية الخاصة بك لتقليل التزامن والتأكد من أن مُعاملات قاعدة البيانات قصيرة الأجل. زيادة قيمة المهلة الافتراضية عن طريق تعيين خيار timeout # داخل ملف settings.py DATABASES = { 'default': { 'ENGINE': 'django.db.backends.sqlite3', 'OPTIONS': { # ... 'timeout': 20, # ... }, } }  
  25. إجابة مسعود زاهي سؤال في هل من الممكن عمل foreign key بين نموذجين في تطبيقين Apps في مشروع جانغو Django؟ كانت الإجابة المقبولة   
    نعم يُمكنك ذلك فقط يجب أن يكون كلاً من التطبيقين موجوداً في INSTALLED_APPS في ملف الإعدادات settings.py.
    #داخل ملف #settings.py INSTALLED_APPS = [ ... 'blog', 'profiles', ... ] بعدها يُمكنك إستخدام النموذج Post داخل التطبيق profiles
    # في الملف profiles/models.py from blog.models import Post #قم باستدعاء النموذج من التطبيق #blog class PostProperty(models.Model): post = models.ForeignKey(Post) كما يُمكنك إستخدامه على الشكل التالي:
    class PostProperty(models.Model): post = models.ForeignKey("blog.Post") #من دون أن تقوم باستدعاء النموذج  
×
×
  • أضف...