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

سامح أشرف

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

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

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

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

    56

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

  1. إجابة سامح أشرف سؤال في كيفية تغير نص رأس صفحة لوحة التحكم الخاصة بجانغو Django؟ كانت الإجابة المقبولة   
    يمكنك أن تقوم بذلك من خلال تعديل ملف urls.py حيث يوفر لك عدة متغيرات تستطيع من خلال تغير النصوص الرئيسية في لوحة التحكم في جانغو Django.
    from django.contrib import admin admin.site.site_header = 'Control Area' # القيمة الإفتراضية : "Django Administration" admin.site.index_title = 'Features area' # القيمة الإفتراضية : "Site administration" admin.site.site_title = 'HTML title' # القيمة الإفتراضية : "Django site admin" يمكنك أيضًا حفظ النصوص في ملف settings.py وإستدعائها كمتغيرات في ملف urls.py على الشكل التالي:
    # settings.py ADMIN_SITE_HEADER = "My Control Area" # urls.py from django.conf import settings admin.site.site_header = settings.ADMIN_SITE_HEADER  
  2. إجابة سامح أشرف سؤال في تجاهل حالة النص Case-insensitive في نموذج جانغو Django؟ كانت الإجابة المقبولة   
    يوفر جانغو Django طريقة للبحث عن النصوص بغض النظر عن حالة الحروف، على النحو التالي:
    User.objects.filter(role__iexact="admin") ويمكن الحصول على نتيجة مشابة من خلال البحث عن النصوص التي تحتوي على الجزء المطلوب البحث عنه، كالتالي:
    User.objects.filter(role__icontains="admin") في المثال الأخير سوف يتم تجاهل حالة الأحرف أيضًا وسوف يتم إرجاع كل الكائنات التي تحتوي على كلمة admin في حقل role بغض النظر عن حالة الأحرف (Case-insensitive).
  3. إجابة سامح أشرف سؤال في ما هي الطريقة الصحيحة لاستخدام get_or_create في جانغو Django؟ كانت الإجابة المقبولة   
    يقوم التابع get_or_create بإرجاع tuple وليس كائن من نوع Post، وبالتالي يجب أن يكون لديك متغيرين قبل علامة الإسناد (علامة = )، يحتوي العنصر الأول في الـ tuple التي تم إرجاعها من هذا التابع على الكائن (في حالة تم الحصول عليه من قاعدة البيانات، أي من خلال عمل get)، أما العنصر الثاني في الـ tuple فهو قيمة منطقية True/False (تكون True في حالة تم إنشاء الكائن، وتكون False في حالة تم إرجاعه ولم يتم إنشاء كائن جديد في قاعدة البيانات).
    User.post,created = Post.objects.get_or_create(category="News") هنا مثال من توثيق Django:
    # get_or_create() a person with similar first names. p, created = Person.objects.get_or_create( first_name='John', last_name='Lennon', defaults={'birthday': date(1940, 10, 9)}, ) # get_or_create()لم يقم التابع بإنشاء كائن في هذه الحالة >>> created False  
  4. إجابة سامح أشرف سؤال في كيف أجعل حقل many-to-many اختياري في جانغو Django؟ كانت الإجابة المقبولة   
    Django سيجبرك على إدخال كل الحقول التي لا تحتوي على الخاصية blank=True أو null=True وبالتالي يجب أن تضيف الخاصية blank=True إلى حقل many-to-many، على النحو التالي:
    class Group(models.Model): events = models.ManyToManyField(Event, blank=True) ملاحظة: الخاصية  null=True ليس لديها أي تأثير على العلاقات من نوع many-to-many، لذلك قمنا بإستعمال الخاصية blank=True، حيث أنها تستعمل في عملية التحقق validation في Django بينما الخاصية null=True تستخدم على مستوى قاعدة البيانات (جعل الحقل nullable)، وبالتالي يكون من المنطقي أن نتسعمل الخاصية blank=True فقط.
  5. إجابة سامح أشرف سؤال في أسرع طريقة للحصول على الكائن الأول من queryset في جانغو Django؟ كانت الإجابة المقبولة   
    لاحظ أن في جميع الطريق السابقة، يتم جلب كل الكائنات التي لديها الخاصية role بقيمة admin، بينما يتم إستخدام فقط الأول كائن، ولا حاجة لطلب كل الكائنات الأخرى من قاعدة البيانات، لذلك يوفر Django التابع first والذي يقوم بجلب أول كائن فقط من قاعدة البيانات، وفي حالة لم يستطع العثور على أي منها سوف يقوم بإرجاع None، وهو ما ترغب به بالضبط.
    يتم إستخدام التابع first على النحو التالي:
    users = User.objects.filter(role = 'admin').first() كما يوفر Django التابع last والذي يقوم بنفس وظيفة التابع first بإستثناء أنه يعيد آخر كائن من قاعدة البيانات وليس الأول.
    users = User.objects.filter(role = 'admin').last() كما يمكنك جلب كل الكائنات من قاعدة البيانات (في حالة كنت بحاجة إليها في وقت لاحق)، وفي نفس الوقت تستطيع إستخدام التابع first بالشكل التالي:
    users = User.objects.filter(role = 'admin').all() firstUser = users.first() بهذه الطريقة سيكون لديك كل كائنات النموذج User وفي نفس الوقت تستطيع الحصول على أول كائن منهم بدون عمل إستعلام جديد في قاعدة البيانات، وفي حالة لم يتم العثور على أي كائنات سوف يتم إعادة None.
  6. إجابة سامح أشرف سؤال في كيفية تعيين قيمة متغير داخل كود قالب في جانغو Django؟ كانت الإجابة المقبولة   
    يوفر Django طريقة لعمل متغيرات محلية local variables داخل القالب نفسه بشكل إفتراضي من خلال كلمة with على النحو التالي:
    {% with name="World" %} <div>Hello {{name}}!</div> <p>This is your first visit, {{name}}?</p> {% endwith %} لاحظ أن المتغير سوف يعمل داخل نطاق العنصر with فقط، لذلك إن كنت في حاجة لمتغير يعمل في كل القالب فسوف تحتاج إلى إحاطة القالب بالعنصر with بالكامل.
    وإن كنت تستخدم قوالب jinja، فيمكنك عمل نفس الشيء من خلال الكود التالي:
    {% set name="Amer" %} <div>Hello {{name}}!</div> <p>This is your first visit, {{name}}?</p>  
  7. إجابة سامح أشرف سؤال في إستخدام متغيرات قالب في JavaScript في جانغو Django كانت الإجابة المقبولة   
    يوجد عدة طريق للقيام بهذا الأمر في Django.
    الطريقة الأولى: إن كان إصدار Django لديك 2.1 أو أحدث، فستجد أن Django يوفر لك json_script لكي تمرر القواميس بشكل كود json، كالتالي:
    {{ value|json_script:"hello-data" }} وستكون النتيجة في المتصفح بالشكل التالي:
    <script id="hello-data" type="application/json">{"hello": "world"}</script> ويمكنك إستخدام هذه البيانات على النحو التالي:
    const value = JSON.parse(document.getElementById('hello-data').textContent); ملاحظة: هذه الطريقة أمنة من ثغرات XSS لأن Django يقوم بتحويل الرموز الخطيرة مثل (< , > , &) ، كالتالي:
    <script id="hello-data" type="application/json">{"hello": "world\\u003C/script\\u003E\\u0026amp;"}</script> الحل الأخر (يعمل مع جميع إصدارات Django)، وهو استخدام حقل الإدخال المخفي في القالب، كالتالي:
    <input type="hidden" id="myDict" name="variable" value="{{ myDict }}"> <script> var myDict = document.getElementById("myDict").value; </script> ملاحظة: لا تحاول أبدًا أن تقوم بإسناد قيمة أي متغير إلى كود JavaScript على النحو التالي:
    <script type="text/javascript"> var x = "{{someDjangoVariable}}"; </script> الكود السابق خطير للغاية لأنه سعرض الموقع لثغرة XSS مما قد يؤدي إلى تنفيذ أكود JavaScript خبيثة لدى زوار الموقع، مما يؤدي إلى سرقة بياناتهم مثل بطاقات الإئتمان والبريد الإلكتروني وكلمات السر أيضًا.
  8. إجابة سامح أشرف سؤال في Webpack تحويل ملفات less إلى css كانت الإجابة المقبولة   
    لاحظ أنك تستعمل الصيغة scss بدلًا من less في الخاصية test، وسيكون الكود الصحيح، كالتالي:
    module.exports = { module: { rules: [ { test: /\-theme.less$/i, // لاحظ صيغة الملفات loader: [ // compiles Less to CSS "style-loader", "css-loader", "less-loader", ], }, ], }, };  
  9. إجابة سامح أشرف سؤال في خطأ No module named MySQLdb في جانغو Django كانت الإجابة المقبولة   
    إذا كان الخطأ يظهر عند محاولة تثبيت حزمة MySQL-python من خلال الأمر التالي:
    pip install MySQL-python فيمكنك تثبيتها بطرق أخرى، مثل إستخدام easy_install على النحو التالي:
    easy_install MySQL-python في حالة كان الخطأ الذي يظهر لديك بعد تثبيتها هو من نوع EnvironmentError كالتالي:
    EnvironmentError: mysql_config not found فسوف تحتاج إلىى تثبيت بعض البرمجيات الإضافية على النحو التالي:
    sudo apt-get install python-mysqldb libmysqlclient-dev python-dev  
  10. إجابة سامح أشرف سؤال في إزالة المسافات من نص لإنشاء عنوان Slug في جانغو Django كانت الإجابة المقبولة   
    يمكنك أن تقوم بذلك من خلال regular expressions كالتالي:
    import re def makeSlug(myString): # قم بإزالة جميع الأحرف بخلاف الكلمات (كل شيء باستثناء الأرقام والحروف) myString = re.sub(r"[^\w\s]", '', myString) # استبدل كل المسافات البيضاء بشرطة سفلية underscore myString = re.sub(r"\s+", '_', myString) return s print(makeSlug("How can this be achieved")) # Output: How_can_this_be_achieved الطريقة السابقة تقوم بإزالة كل الحروف والرموز (ماعدا الأرقام والحروف اللاتينية) وتستبدل كل المسافات بعلامة شرطة سفلية underscore _
    كما أن Django يحتوي على دالة slugify بالفعل التي تقوم بعمل عنوان slug من خلال أي نص، على النحو التالي:
     
    from django.template.defaultfilters import slugify slugify("How can this be achieved") # How-can-this-be-achieved كما يفضل أن تستخدم الشرطات dashes - لأنه، لفترة طويلة، تعاملت محركات البحث مع الشرطات كفواصل للكلمات، وبذلك تحصل على نتيجة أفضل في عمليات البحث عن كلمات متعددة long keywords.
  11. إجابة سامح أشرف سؤال في عمل ملفات قابلة للتحميل من خلال جانغو Django كانت الإجابة المقبولة   
    يمكنك إستخدام الوحدة X-Sendfile: حيث ينشئ django المسار إلى الملف، ولكن يتم معالجة تقديم الملف الفعلي بواسطة Apache / Lighttpd. بمجرد قيامك بإعداد mod_xsendfile، فإن إستخدامه مع العرض الخاص بك يستغرق بضعة أسطر فقط:
    from django.utils.encoding import smart_str res = HttpResponse(content_type='application/force-download') res['Content-Disposition'] = f"attachment; filename={smart_str(file_name)}" res['X-Sendfile'] = smart_str("path/to/file") return res بالطبع، لن يحدث هذا الأمر إلا إذا كنت تتحكم في الخادم الخاص بك (أي أن لديك القدرة على تنفيذ أوامر على الخادم لإعداد mod_xsendfile)، أو إذا كانت شركة الاستضافة الخاصة بك قد قامت بإعداد ملف mod_xsend بالفعل.
    ملاحظة: هذه الطريقة لا تعمل إلا مع الملفات التي لديها أسماء من رموز ASCII فقط، وأي ملفات تحمل أسماء برموز مختلفة (حروف عربية، صينية، رموز إموجي .. إلخ) لن تعمل وستسبب خطأ لأن الوجدة X-Sendfile لا يمكنها التعامل مع رموز غير رموز ASCII.
    ملاحظة: إذا كنت تستعمل Django بإصدار أقدم من 1.7 فيجب أن تستخدم mimetype كما في المثال التالي، حيث تم استبدال mimetype بـ content_type في الإصدار 1.7
    response = HttpResponse(mimetype='application/force-download') # < 1.7  
  12. إجابة سامح أشرف سؤال في خطأ No module named psycopg2.extensions أثناء تشغيل مشروع جانغو Django كانت الإجابة المقبولة   
    يبدو أنك لم تقم بتثبيت قواعد بيانات postgres على الخادم، لذلك يظهر لك خطأ يخبرك أنك بحاجة لتثبيت postgresql-server، ويمكنك حل هذه المشكلة عبر الأمر التالي:
    sudo apt-get install -y postgresql python-psycopg2 libpq-dev python-dev postgresql-contrib سيقوم هذا الأمر بتثبيت كل الحزم المطلوبة لكي تعمل قواعد بيانات postgres، وفي حالة اكن لديك أكثر من نسخة بايثون مثبته على الخادم، فسيكون أمر التثبيت لبايثون 3 كالتالي:
    sudo apt-get install postgresql python3-psycopg2 libpq-dev postgresql-contrib بعد ذلك تستطيع أن تقوم بتثبيت حزمة psycopg2 عبر الأمر التالي:
    pip3 install psycopg2  
  13. إجابة سامح أشرف سؤال في ما هي الدالة reverse في جانغو Django؟ كانت الإجابة المقبولة   
    لنفترض أنك قمت بتعريف هذا العنوان في عناوين urls.py الخاصة بك:
    url(r'^something$', some_view, name='something_name'), في النموذج ، يمكنك بعد ذلك الرجوع إلى عنوان url هذا من خلال اسمه على النحو التالي:
    <!-- django <= 1.4 --> <a href="{% url something_name %}">رابط إلى some_view</a> <!-- django >= 1.5 --> <a href="{% url 'something_name' %}">رابط إلى some_view</a> <!-- أو كالتالي --> <a href="% load url from future %}">رابط إلى some_view</a> سيتم عرض هذا، كالتالي:
    <a href="/something/">رابط إلى some_view</a> لاحظ كيف تم عرض مسار الرابط الكامل.
    لنفترض الآن أنك تريد أن تفعل شيئًا مشابهًا في views.py - على سبيل المثال أنت تتعامل مع بعض عناوين URL الأخرى (ليس /something/) في ملف عرض أخر (وليس some_view) وتريد إعادة توجيه المستخدم إلى /something/ (غالبًا ما يحدث عند إرسال نموذج form ناجح). وللقيام بذلك يمكنك إستخدام الكائن HttpResponseRedirect كالتالي:
    return HttpResponseRedirect('/something/') ولكن ماذا لو كنت تريد تغيير عنوان URL في المستقبل؟ يجب عليك تحديث الملف urls.py وجميع المراجع إليه في كل الكود الخاص بالمشروع. وليس من الجيد القيام بذلك لأنه يستغرق الكثير من الوقت وجهد وكذلك يعرض الموقع للأخطاء، والأفضل هو التعديل في مكان واحد فقط. بدلاً من ذلك، يمكنك إستخدام التالي:
    from django.urls import reverse return HttpResponseRedirect(reverse('something_name')) يبحث هذا في جميع عناوين URL المحددة في مشروعك لعنوان URL المحدد بالاسم something_name ويعيد عنوان URL الفعلي /something/. هذا يعني أنك تشير إلى عنوان URL فقط من خلال اسمه - إذا كنت تريد تغيير عنوان URL نفسه أو ملف العرض الذي يشير إليه، فيمكنك القيام بذلك عن طريق التعديل في مكان واحد فقط وهو الملف urls.py.
    كما يمكنك تمرير معاملات إلى رابط URL من خلال الدالة reverse كالتالي:
    # URL: /cities/cairo/ return HttpResponseRedirect(reverse('cities', args=('cairo',)))  
  14. إجابة سامح أشرف سؤال في فشل التجميع الفرعي في webpack كانت الإجابة المقبولة   
    المشكلة في الواقع هي المحمل file-loader ، لأنها ببساطة تنسخ الملف. مع مرور الوقت تحاول الإضافة html-webpack-plugin كتابة الملف index.html، والذي تمت كتابته بالفعل بواسطة المحمل file-loader، مما يؤدي إلى حدوث تعارض. هناك عدة طرق لحل هذه المشكلة. 
    يمكنك استخدام مُحمل html-loader لكود HTML الخاص بك، على الرغم من أنك إذا كنت تتوقع نسخ HTML الذي تم استيراده ببساطة، فهذا ليس الخيار الصحيح. 
    إذا كنت ترغب في الاستمرار في استخدام المحمل file-loader لملفات HTML الأخرى، فيمكنك استبعاد index.html حتى تعود الإضافة html-webpack-plugin إلى المُحمل الافتراضية. يتطلب require.resolve أن يعمل مثل جملة require ولكنه يمنحك المسار الكامل full path للوحدة بدلاً من محتواها.
    { test: /\.html$/, exclude: [/node_modules/, require.resolve('./index.html')], // لن يتم تحميل هذه الملفات من قبل file-loader use: { loader: 'file-loader', query: { name: '[name].[ext]' }, }, }, الكود السابق سوف يحل المشكة، لكن عندما لا يوجد أي محمل مع القالب، فإن الإضافة html-webpack-plugin تستخدم أداة تحميل ejs كبديل احتياطي. أما إذا لم تكن بحاجة إلى أي محمل لملفات .html، فيمكنك إزالة القاعدة بالكامل وستعمل بشكل جيد.
  15. إجابة سامح أشرف سؤال في خطأ Bad Request (400) عند وضع DEBUG=False في جانغو Django كانت الإجابة المقبولة   
    يجب أن تحتوي قائمة ALLOWED_HOSTS على أسم مضيف بشكل صحيح، وليس عناوين url. اترك المنفذ port (8000) والبروتوكول (http). إذا كنت تستخدم 127.0.0.1 ، فقم بإضافة مضيف محلي إلى القائمة كالتالي:
    ALLOWED_HOSTS = ['127.0.0.1', 'localhost'] يمكنك أيضًا استخدام * لمطابقة أي مضيف:
    ALLOWED_HOSTS = ['*'] لكن لا تقم بإستخدام هذه الطريقة في مرحلة الإنتتاج production أبدًا لأنها تقوم بتعديل هذه حماية من الأساس، حيث سيتم مطابقة أي مضيف بدون التحقق منه.
    يرجع سبب الخطأ 400 الذي تحصل عليه إلى ظهور استثناء SuspiciousOperation عندما لا يتطابق اسم المضيف (127.0.0.1) مع أي قيمة من القيم في تلك القائمة.
  16. إجابة سامح أشرف سؤال في إضافة نموذج ديناميكيًا إلىformset في جانغو Django كانت الإجابة المقبولة   
    يمكنك أن تقوم بهذا الأمر بطريقة سهلة من خلال jQuery ، كالتالي:
    {{ serviceFormset.creating_form }} <div class="form_set"> {% for f in serviceFormset.forms %} <table class='no_error form'> {{ f.as_table }} </table> {% endfor %} </div> <input type="button" value="Add New Form" id="add"> <script> $('#add').click(function() { addMoreForms('table.form:last', 'service'); }); </script> الكود السابق (في القالب template) يقوم بعرض نموذج جديد عند الضغط على زر Add New Form.
    ودالة addMoreForms، ستكون كالتالي:
    function addMoreForms(selector, type) { let newForm = $(selector).clone(true); let totalValue = $('#id_' + type + '-total_forms').val(); newForm.find(':input').each(function() { let name = $(this).attr('name').replace('-' + (totalValue-1) + '-', '-' + totalValue + '-'); let id_ = 'id_' + name; $(this).attr({'name': name, 'id': id_}).val('').removeAttr('checked'); }); newForm.find('label').each(function() { let newFor = $(this).attr('for').replace('-' + (totalValue - 1) + '-', '-' + totalValue + '-'); $(this).attr('for', newFor); }); total++; $('#id_' + type + '-total_forms').val(totalValue); $(selector).after(newForm); } هذه الدالة مفيدة بشكل كبير لأن طريقة إعدادها تسمح لك باستخدامها في جميع أنحاء التطبيق عندما ترغب في عرض المزيد من النماذج في formset.
  17. إجابة سامح أشرف سؤال في خطأ DatabaseError: current transaction is aborted في جانغو Django؟ كانت الإجابة المقبولة   
    هذا الخطأ سحدث في قواعد بيانات postgres وينتج عن استعلام خاطيء ومحاولة تشغيل استعلام آخر دون التراجع عن المعاملة أولاً rolling back. (قد تفكر في الأمر على أنه ميزة أمان ، لمنعك من إتلاف بياناتك)
    لإصلاح ذلك، سترغب في معرفة مكان تنفيذ هذا الاستعلام الخاطيء في الكود. قد يكون من المفيد استخدام خياري log_statement و log_min_error_statement في خادم postgresql، لمعرفة الإستعلامات التي يتم تنفيذها.
    بعد إصلاح الكود ستحتاج إلى عمل rolling back من خلال الكود التالي:
    from django.db import transaction, DatabaseError try: a.save() except DatabaseError: transaction.rollback() الكود السابق مساوي لجملة ROLLBACK في SQL، يمكنك معرفة المزيد عن هذا الأمر من خلال موسوعة حسوب من هنا (الأمر ROLLBACK)
    أيضًا قد يكون سبب الخطأ هو عدم مزامنة قاعدة البيانات، ولحل هذا الأمر يمكنك أن تستخدم الأمر syncdb (والذي يأتي مضمنًا في Django)، كالتالي:
    python3 manage.py syncdb بعد ذلك يمكنك عمل تهجير للبيانات مرة أخرى للتأكد من إصلاح الخطأ، كالتالي:
    python3 manage.py migrate  
  18. إجابة سامح أشرف سؤال في ايه هو المسار الكامل لاحتراف wordpress كانت الإجابة المقبولة   
    تطوير WordPress ينقسم إلى جزئين:
    تطوير قوالب WordPress تطوير الإضافات Plugins ولتعلم كيفية تطوير أي منهما يجب أن تكون على دراية بالأساسيات البرمجية بشكل عام وبلغة PHP بشكل خاص، لأن WordPress مبني بالكامل بهذه اللغة، كما يجب أن تقوم بتعلم أستخدام WordPress نفسه وتجريب كيفية تركيب الإضافات والقوالب، ثم تقوم بتطوير أول قالب بسيط من بعض الأساسيات مثل إنشاء Header و Footer وصفحة التدوينات .. إلخ، ثم تنتقل إلى عمل قوالب متطورة أكثر ولها لوحة تحكم خاصة، لكي يستطيع المستخدم من تعديل إعدادات القالب والموقع عمومًا أو حتى التواصل مع مطوري القالب من خلالها، ستحتاج بعد ذلك تعلم كيفية عمل optimize لموقع مبني بـ WordPress (الكثير من المواقع تعاني من مشاكل في البطيء بسبب القوالب أو الإضافات المثبتة)، لذلك ستكون هذه نقطة قوة لديك. بعد ذلك سيكون لديك المعرفة والخبرة الكافية للبحث عن المشاكل التي تواجه مستخدمي WordPress وتعلم كيفية حلها، كما إختبار القوالب الإحترافية وتحليلها سيوضح لك الكثير من الأمور التي تريد أن تتعلمها لكي يكون لديك المعرفة لإنشائها من الصفر.  ينطبق نفس الأمر على تطوير الإضافات Plugins.
    إن كنت تسأل عن أي دورة تحتوي على مسار لتعلم WordPressن فتحتوي الأكاديمية على دورة تطوير تطبيقات الويب باستخدام لغة PHP، التي تقوم بالبدء بالأساسيات في البرمجة بإستخدام لغة PHP وكذلك البرمجة الكائنية OOP، ثم تنتقل إلى أساسيات إطار العمل Laravel (أشهر إطار عمل للغة PHP الوقت الحالي)، بعد ذلك تبدأ في التطبيق أكثر والتعمق في Laravel من خلال إنشاء نموذج مصغر لشبكة اجتماعية تشبه انستغرام، وكذلك عمل RESTful API للتطبيقات، وتتعلم بعد ذلك أيضًا تطوير موقع إعلانات مبوبة، وموقع لمشاركة الفيديوهات، بعد ذلك تنتقل لتعلم أساسيات WordPress وكيفية تطوير قوالب مخصصه لـ WordPress.
    وهذه الدورة الوحيدة التي تحتوي على شرح لنظام إدارة المحتوى WordPress
    يمكنك معرفة المزيد عن هذه الدورة من خلال هذه الصفحة (دورة تطوير تطبيقات الويب باستخدام لغة PHP).
    كما تحتوي الأكاديمية على الكثير من المقالات المتعلقة بلغة PHP وWordPress أيضًا، يمكنك الإطلاع عليها من هنا
  19. إجابة سامح أشرف سؤال في كيف تتحقق مما إذا كان المستخدم قد قام بتسجيل الدخول في جانغو Django؟ كانت الإجابة المقبولة   
    بداية من الإصدار 1.10 من Django أصبحت is_authenticated عبارة عن خاصية attribute بدلًا من تابع method، ويمكنك أن تستخدمها كالتالي:
    if request.user.is_authenticated: # افعل شيئًا إذا تمت مصادقة المستخدم ويمكنك أن تستخدمها في القوالب، كالتالي:
    {% if request.user.is_authenticated %} <p>{{ user }}</p> {% endif %} أما بالنسبة إلى الإصدار 1.9 وما قبله، فيجب أن تقوم بإضافة أقواس الأستدعاء كالتالي:
    if request.user.is_authenticated(): # افعل شيئًا إذا تمت مصادقة المستخدم  
  20. إجابة سامح أشرف سؤال في متى تستخدم إطار عمل مثل Next أو Gatsby مقابل الاطار Create React App كانت الإجابة المقبولة   
    لا يتحوي create-react-app على كل المميزات التي قد تحتاجها في المشروع، فعلى سبيل المثال لا يتحتوي على طريقة إفتراضية لتغير المسارات routes ويجب عليك تثبيت حزم أخرى مثل react-router لكي تقوم بذلك، كما أنه لا يمكنك من توليد صفحات ثابتة static pages بسهولة، ولا يحتوي على ميزة SSR (Server Side Rendering) أو SSG (Static Site Generation) بشكل إفتراضي، مما قد يؤثر على السيو SEO الخاص بالموقع، وغيرها من الممزايات التي تجد نفسك في حاجة إليها في كل مشروع تقريبًا تقوم بعمليه.
    ولحل مثل هذه المشاكل، ظهرت إطارات عمل مختلفة مبنية على React نفسه، مثل Next.js و Gatsby، ولكل منهما مميزات مختلفة، فعلى سبيل المثال يحتوي إطار العمل Next.js على العديد من المميزات منها:
    دعم TypeScript: لن تحتاج إلى الكثير من الخطوات لتستطيع أن تستخدم TypeScript في المشروع pre-rendering SSR + SSG : يدعم Next.js ما يسمى Hybrid أي أنه يقوم بتحويل الصفحات الثابتة إلى SSG تلقائيًا والصفحات الأخرى تكون من نوع SSR file-system routing: لن تحتاج إلى تثبيت حزم خارجية لكي تقوم بعمل Route System، فقط قم بتنظيم الملفات بالطريقة التي تريد وستجد أن كل المسارات تعمل بنفس طريقة ترتيب الملفات والمجلدات داخل بعضها البعض. zero config: لا يوجد أي إعدادات تحتاج إن أن تقوم بعملها لكي يعمل المشروع بكفاءة، فقط أكتب الكود وشاهد النتيجة في المتصفح مباشرة. Image Optimization: يمكن لإطار العمل Next.js ضغط وإعادة تحجيم الصور لتقليل حجم النطاق الترددي Bandwidth إلى أقصى حد من خلال عمل مكون Image مخصص. code splitting: يقوم Next.js بتقسيم الكود إلى ملفات صغيرة تسمى chunks ويتم تحميل الكود المطلوب فقط إلى المتصفح، وبالتالي يتم تحميل الصفحات بشكل أسرع وعرض النتيجة في وقت أقل. لذلك أنتقل الكثير من مطوري React.js إلى إستخدام Next.js وGatsby بسبب المميزات التي يقدمها.
  21. إجابة سامح أشرف سؤال في كيف يمكنني الحصول على الكائن إذا كان موجودًا ، أو None إذا لم يكن موجودًا في جانغو Django؟ كانت الإجابة المقبولة   
    لا توجد طريقة "built-in" للقيام بذلك في Django بشكل إفتراضي. سيظهر Django استثناء DoesNotExist في كل مرة. الطريقة الأسهل للتعامل مع هذا في Python هي إستخدام جملة try .. except، كالتالي:
    try: writers = User.objects.get(role="writer") except User.DoesNotExist: writers = None ما فعلته هوإستخدام نوع الخطأ User.DoesNotExist للتأكد من وجود الكائن، بهذه الطريقة يمكنك معرفة إن لم يوجد أي كتاب writers في الموقع، يمكنك أيضًا أن تستخدم نوع الخطأ ObjectDoesNotExist كالتالي:
    from django.core.exceptions import ObjectDoesNotExist try: writers = User.objects.get(role="writer") except ObjectDoesNotExist: writers = None وفي حالة كنت تريد أن يتم إحضار أو كائن فقط، فيمكنك أن تستخدم التابع first، كالتالي:
    User.objects.filter(role="writer").first() في حالة أردت التأكد فقط من وجود الكائن في قاعدة البيانات، فيمكنك أن تستعمل exists، كالتالي:
    User.objects.filter(role="writer").exists()  
  22. إجابة سامح أشرف سؤال في قوالب html webpack5 التي تحتوي على أجزاء لا تعمل مع "npm run dev" كانت الإجابة المقبولة   
    أولًا يجب عليك التأكد من أنك قمت بتثبيت html-loader بشكل سليم، يمكنك أن تقوم بتثثبيته من خلال الأمر التالي:
    npm i html-loader --save-dev كما يجب تعديل ملف webpack.config.js وإضافة الخاصية entry، كالتالي:
    const HtmlWebpackPlugin = require('html-webpack-plugin'); const path = require('path'); module.exports = { mode: "development", entry: path.resolve(__dirname, 'src') + '/index.js', module: { rules: [ { test: /\.html$/, exclude: /node_modules/, use: ['html-loader'] } ] }, plugins: [ new HtmlWebpackPlugin({ filename: 'index.html', template: './src/templates/index.html', }) ] } في حالة تشغيل الخادم إستمرار المشكلة فستجد رسالة خطأ في سطر الأوامر، توضح سبب المشكلة، أرجو إرفاقها إن وجدت.
  23. إجابة سامح أشرف سؤال في تشغيل سكريبت Python من خلال Django Shell كانت الإجابة المقبولة   
    يمكنك أن تقوم بذلك من خلال العلامة < بدلًا من << ليصبح الأمر كالتالي:
    ./manage.py shell < clear_db.py يمكنك أيضًا أن تقوم بتنفيذ السكريبت من خلال الدالة exec، كالتالي:
    $ ./manage.py shell ... >>> exec(open("./clear_db.py").read()) وإن كنت تستعمل بايثون 2.7 فيمكنك أن تستخدم الدالة execfile، كالتالي:
    $ ./manage.py shell ... >>> execfile('clear_db.py') إن كنت تستعمل Windows Powershell فسوف تحتاج إلى إستخدام Get-Content:
    Get-Content clear_db.py | .\manage.py shell على العموم لا يُنصح بفعل ذلك من shell - وهذا لأنه لا ينبغي لك تنفيذ سكريبتات عشوائية من بيئة Django (ولكن هناك طرقًا للتغلب على ذلك).
    إذا كان هذا السكريبت سيتم تشغيله عدة مرات، فمن الجيد إعداده كأمر مخصص، كالتالي:
    ./manage.py clear_db للقيام بذلك، قم بإنشاء ملف باسم clear_db.py في مجلد management، وفي هذا الملف، حدد الأمر المخصص الخاص بك (تأكد من أن اسم الملف هو اسم الأمر الذي تريد التنفيذ منه.):
    from django.core.management.base import BaseCommand class Command(BaseCommand): def handle(self, **options): # قم بكتابة السكريبت هنا  
  24. إجابة سامح أشرف سؤال في مشكلة عرض قيمة الاختيار في جانغو Django كانت الإجابة المقبولة   
    يوفر لك Django إمكانية إستخدام أي خاصية من خلال كتابة التالي:
    <النموذج>.get_<اسم الخاصية>_display وبالتالي لطباعة القيمة الكاملة للخاصية gender في النموذج User ستكون كالتالي:
    {{ user.gender}} # M {{ user.get_gender_display }} # Male وفي حالة إستخدام Jinja2 كمحرك القوالب، فيجب أن يتم إضافة قوسين في النهاية ، كالتالي:
    {{ user.get_gender_display() }}  
  25. إجابة سامح أشرف سؤال في كيف أقوم بتصفية عناصر الاستعلام حسب نطاق التاريخ في جانغو Django؟ كانت الإجابة المقبولة   
    يمكنك أن تستخدم المدخل date__range، كالتالي:
    Video.objects.filter(date__range=["2021-08-01", "2021-08-31"]) لاحظ أن الحل السابق يقوم بتنفيذ جملة BETWEEN في SQL، مما يعني أن النطاق يتضمن يومي 1/8 و 31/8 أيضًا.
    إذا كنت لا تريد تضمين هذين اليومين مع النتائج، فيمكنك أن تستخدم خاصية gt (greater-than) و lt (less-than)، كالتالي:
    import datetime videos = Video.objects.filter(video_date__gte=datetime.date(2021, 8, 1), video_date__lte=datetime.date(2021, 8, 31)) أو إذا كنت تحاول فقط التصفية حسب الشهر:
    Video.objects.filter(date__year='2021', date__month='08')  
×
×
  • أضف...