سامح أشرف
-
المساهمات
2934 -
تاريخ الانضمام
-
تاريخ آخر زيارة
-
عدد الأيام التي تصدر بها
56
إجابات الأسئلة
-
إجابة سامح أشرف سؤال في كيف يمكنني استنساخ كائن من نموذج جانغو Django وحفظه في قاعدة البيانات؟ كانت الإجابة المقبولة
يمكنك أن تقوم بذلك بأكثر من طريقة وأسهلهم هي من خلال عمل نسخة من الكائن وجعل الـ Primary Key يساوي None، كالتالي:
obj = User.objects.get(pk=1) obj.pk = None obj.save() الكود السابق يقوم بجلب instance من الكائن ثم نقوم بجعل الـ id بقيمة None، وبالتالي عند تشغيل التابع save سوف يقوم بعمل صف جديد في قاعدة البيانات.
بالطبع يمكنك أن تقوم بتحديث/تعديل الكائم قبل حفظه بشكل طبيعي، كما ينصح توثيق Django أن تقوم بجعل الخاصية _state.adding تساوي True، لكي تتم عملية إنشاء كائن جديد بشكل سليم كالتالي:
post = Post(title='My first blogpost', summary='Blogging is easy') post.save() # post.pk == 1 post.pk = None post._state.adding = True post.save() # post.pk == 2 عملية الحفظ الأولى سوف تقوم بإنشاء أول صف في الجدول في قاعدة البيانات، بينما عملية الحفظ الثانية سوف تقوم بعمل صف جديد في نفس الجدول.
-
إجابة سامح أشرف سؤال في ما هو ال Back-end المناسب لمشروعي Flutter كانت الإجابة المقبولة
يمكنك أن تستعمل أي لغة خاصة بالواجهات الخلفية Backend و أي إطار عمل ترغب به (أو حتى بدون إطار عمل على الإطلاق)، وهنا بعض الأمثلة:
PHP مع إطار العمل Laravel: تعد لغة PHP أشهر لغة للواجهات الخلفية في الوقت الحالي، كما أن Laravel هو أكثر إطار عمل مستخدم أيضًا، لغة PHP مجهزة بالفعل لخوادم الويب، لأنها صممت في الأساس لهذا الغرض، كما أن إطار العمل Laravel يوفر لك بنية سهلة وبسيطة لعمل API للتطبيقات أو البرامج بسهولة، كما يوفر لك نظام إستيثاق Authentication مُعد بالفعل ولن تحتاج إلى ضبط أي شيء، وهو يتبع نظام MVC مما يوفر لك تنظيم للكود والملفات أيضًا. لغة PHP مستخدمه في Facebook و Wikipedia وغيرها. Node.js مع إطار العمل Express.js: إزدادت في الفترة الأخيرة شعبية لغة JavaScript خصوصًا في الواجهات الخلفية، حيث أصبح هناك مسار لتعلم تطوير المواقع يسمى MERN (MongoDB - Express.js - React.js - Node.js)، لكن يمكنك أن تستخدم أي نوع من قواعد البيانات وليس شرطًا أن تستعمل MongoDB، ويمكنك أن تقوم بعمل API به أيضًا. إطار العمل Express.js مستخدم في شركات مثل Uber و Yandex و IBM وغيرها. Python مع إطار العمل Django: لغة Python من أسهل اللغات في التعلم ومن أسهلها في كتابة الكود، ولها العديد من المميزات، كما أن إطار العمل Django يوفر لك بنية أولية مجهزة لتقوم ببناء أي مشروع به، ويمكنك أن تقوم بعمل API أيضًا به بكل سهولة بسبب مميزات JSON وXML التي يقدمها. إطار العمل Django يتم إستعماله في Disqus و Instagram و Spotify و YouTube و DropBox و Pinterest و غيرها. يمكنك أن تستعمل أي لغة من اللغات السابقة (أو غيرها حتى)، فكل هذه اللغات يمكنها أن تقوم بكل ما تريده وأكثر وبسهولة أيضًا. كما يمكنك أن تختار أحد إطارات العمل التي ذكرتها أو تستخدم إطارات عمل أخرى، ولكني ذكرت فقط الأكثر شهرة وإستخدامًا في هذه اللغات.
ويوجد في الأكاديمية مقالة حول الفرق بين Laravel و Django وكذلك Rails:
بالنسبة لقاعدة البيانات، فلا أنصحك بأن تستخدم SQLite موقع حقيقي أو لحفظ وإسترجاع البيانات بسرعة، بدلًا من ذلك يمكنك أن تستخدم MySQL أو Postgres، وهنا مقالة تتمحور حول عيوب ومميزات كل نوع من الأنواع السابقة:
-
إجابة سامح أشرف سؤال في خطأ 500 عند وضع DEBUG = False في جانغو Django كانت الإجابة المقبولة
يجب أن تقوم بإضافة نطاق الموقع إلى القائمة ALLOWED_HOSTS وكذلك localhost (أثناء عملية التطوير)،هذه القائمة تمثل أسماء النطاقات domains /المضيف host التي يمكن لموقع Django هذا أن يخدمها (أي يمكن لهذه المواقع أن ترسل طلبات إلى هذا المشروع). لحل المشكلة يجب أن تقوم بإضافة نطاق المواقع الخاص بك إلى هذه القائمة، كالتالي:
ALLOWED_HOSTS = ['142.250.201.46', 'example.com'] بعد ذلك يجب إعادة تتشغيل خادم الويب Apache، وقد يختلف هذا الأمر حسب الطريقة التي تم بها تثبيته، وحسب نظام التشغيل، لكن في الغالبي يمكنك أن تستخدم الأمر التالي:
sudo service apache2 reload كما يمكنك أن تضيف نجمة فقط إلى هذه القائمة، كالتالي:
ALLOWED_HOSTS = ['*'] تستخدم هذه الطريقة أثناء مرحلة التطوير فقط، ولا تستخدمها أبدًا عند نشر التطبيق production لأنها تقوم بإيقاف نظام الحماية هذا بالكامل، وسيمكن لأي موقع أن يرسل طلبات إلى موقعك.
-
إجابة سامح أشرف سؤال في ما هي فائدة webpack؟ كانت الإجابة المقبولة
Webpack عبارة عن مُجمّع ملفات ثابتة (مثل الصور وتنسيقات CSS وغيرها) لتطبيقات JavaScript الحديثة. ويوفر Webpack مجموعة كبيرة من الإعدادات والإضافات التي تسهل هذه العملية، كما يوفر Webpack أيضًا ما يسمى المحملات loaders التي تمكننا من التعامل مع أنواع مختلفة من الملفات وضغطها وتوفيرها في مجلد المشروع النهائي، ونفس الأمر بالنسبة لكود CSS أو SCSS و JavaScript حيث يقوم Webpack بمساعدة babel على سبيل المثال من تحويل كود JavaScript من نسخة حديثة مثل ES6 أو ES7 إلى إصدار أقدم من JavaScript وبالتالي يمكن لمجموعة أكبر من المتصفحات تنفيذ كود JavaScript بدون مشكلة.
كما يمكن إستخدام Webpack بملف إعدادات مختلف webpack.config.js لبناء أكثر من نسخة من نفس المشروع، نسخة للتطوير development ونسخة أخرى للنشر production على سبيل المثال.
وكل ملخص لما سبق، يقوم Webpack بإستخدام Node.js لعمل الكثير من المهام المعتادة وأتمتتها بسهولة من خلال الكثير من الإضافات plugins والمحملات loaders.
-
إجابة سامح أشرف سؤال في الحصول على رقم index في حلقة for في قالب جانغو Django كانت الإجابة المقبولة
توفر حلقة for في القوالب template الكائن forloop الذي يحتوي على الخاصية counter و counter0 والتي تعبر عن رقم التكرار في الحلقة (يمكن إعتباره مثل index)، حيث يبدأ الأول من 1 بينما counter0 يبدأ من 0 في العد
لذلك يمكنك الحصول على النتيجة المرجوة من خلال الكود التالي:
<ul> {% for day in daysList %} <li># Day {{ forloop.counter }} - From {{ day.from_location }} to {{ day.to_location }}</li> {% endfor %} </ul> كما يوفر هذا الكائن مجموعة أخرى من الخصائص مثل revcounter و revcounter0 و first و last وكذلك parentloop للتعامل مع حلقات for متداخلة.
-
إجابة سامح أشرف سؤال في ما الفرق بين Django Model() و Model.objects.create() في جانغو Django؟ كانت الإجابة المقبولة
ما تعتقده صحيح، حيث في السطر الأول يجب أن تستدعي التابع save لكي يقوم بحفظ الكائن في قاعدة البيانات، وهذا الأمر يفيد إن كنت تريد التعديل على الكائن قبل حفظه، بينما في السطر الثاني يتم إنشاء الكائن بشكل مباشر في قاعدة البيانات في خطوة واحدة، مما يجعل من الكود أقصر وأكثر قابلية للقراءة.
حسب توثيق Django:
أي أن التابع save يسمح لك بعمل مجموعة من الخيارات المتقدمة، بينما create يسمح لك بحفظ الكائن في قاعدة البيانات في خطوة واحدة.
من المميزات التي يسمح لك التابع save القيام بها هي عمل INSERT OR UPDATE للكائن في قاعدة البيانات وبالتالي في حالة وجود الكائن في قاعدة البيانات بالفعل سوف يتم تحديثه، بينما في حالة إستخدام create سوف يظهر خطأ كالتالي:
# django.db.utils.IntegrityError: (1062, "Duplicate entry '13' for key 'PRIMARY'") ويمكنك أن تتحكم في هذه الميزة عبر المدخل force_insert والذي يقبل قيمة منطقية True/False.
الأمر الأخير هو أن التابع save يقوم بإرجاع None، بينما create يقوم بإرجاع instance من هذا النموذج.
-
إجابة سامح أشرف سؤال في كيفية عمل تنقل بين الصور بإستخدام Timer كانت الإجابة المقبولة
إستخدام المؤقت timer مع أزرار التنقل بشكل منفصل قد يسبب بعض المشاكل، لكن في حالة إستخدمت المؤقت داخل الدالة currentSlide كما وضحت سابقًا، سوف يحل هذه المشكلة، حيث يتم حذف المؤقت في كل مرة يتم الضغط على أحد الأزرار من خلال clearInterval وعمل مؤقت جديد ليبدأ عد خمس ثواني، كالتالي:
var timer; // الدالة الخاصة برموز الاتجاهات function currentSlide(n) { showSlides(slideIndex = n); // حذف المؤقت القديم إن وجد if (timer) { clearInterval(timer); } // يتم تعديل قيمة المتغير timer بمؤقت جديد timer = setInterval(function () { showSlides(slideIndex); console.log(slideIndex); slideIndex++; }, 5000); }
هذا مجرد تعليق comment لهذه الخاصية (يمكنك كتابة تعليقات CSS داخل الخاصية style بدون مشكلة)، ويمكنك حذف هذه الخاصية (text-align) إن أردت فكل ما تقوم به هو محاذات الأزرار إلى المنتصف.
-
إجابة سامح أشرف سؤال في كيف أحصل على عنوان IP للمستخدم في جانغو Django؟ كانت الإجابة المقبولة
يمكنك أن تقوم بعمل دالة تقوم بإرجاع عنوان IP ، كالتالي:
def getClientIP(request): x_forwarded_for = request.META.get('HTTP_X_FORWARDED_FOR') # في حالة وجود العنصر HTTP_X_FORWARDED_FOR سوف يحتوي على عنوان IP في بدايته if x_forwarded_for: ip = x_forwarded_for.split(',')[0] else: ip = request.META.get('REMOTE_ADDR') return ip لاحظ كيف تم إستخدام التابع get حتى تحتدث مشكلة في حالة عدم وجود المفتاح REMOTE_ADDR (سوف يتم إرجاع None في هذه الحالة).
كما يجب أن تتأكد من إعدادات reverse proxy بشكل صحيح (إن وجد)، على سبيل المثال: تثبيت mod_rpaf لخادم الويب Apache.
ملاحظة: يحتوي العنصر X-Forwarded-For على عنوان IP في بدايته في أغلب الأحيان، ولكن في أحيان أخرى مثل في خوادم Heroku يتم وضع عنوان IP في نهايته، أي أنك يجب أن تستخدم -1 بدلًا من 0، كالتالي:
def getClientIP(request): x_forwarded_for = request.META.get('HTTP_X_FORWARDED_FOR') # في حالة وجود العنصر HTTP_X_FORWARDED_FOR سوف يحتوي على عنوان IP في بدايته if x_forwarded_for: ip = x_forwarded_for.split(',')[-1].strip() else: ip = request.META.get('REMOTE_ADDR') return ip الآن يمكنك أن تستعمل الدالة كالتالي:
client_ip = getClientIP(request) كما يمكنك أن تستعمل حزمة جاهزة للحصول على عنوان IP مثل حزمة django-ipware، أولًا يجب تثبيتها من خلال أحد الطرق التالية:
1. easy_install django-ipware 2. pip install django-ipware 3. git clone http://github.com/un33k/django-ipware a. cd django-ipware b. run python setup.py install 4. wget https://github.com/un33k/django-ipware/zipball/master a. unzip the downloaded file b. cd into django-ipware-* directory c. run python setup.py install ويتم إستعمال الحزمة كالتالي:
# في ملف عرض view أو middleware حيث يكون الكائن `request` متاحًا from ipware import get_client_ip ip, is_routable = get_client_ip(request) if ip is None: # تعذر الحصول على عنوان IP الخاص بالعميل pass else: # في حالة وجود عنوان IP print(ip)
-
إجابة سامح أشرف سؤال في جلب عدد من السجلات في جملة إستعلام واحد في جانغو Django كانت الإجابة المقبولة
تتيح لغة SQL الإستعلام عن مجموعة من السجلات من خلال جملة واحدة كالتالي:
SELECT * FROM users WHERE id in (1, 2, 3, 4) كما يوفر Django نفس هذه الطريقة في الإستعلام من خلال المعامل in، كالتالي:
User.objects.filter(pk__in=[1, 2, 3, 4]) أو يمكنك البحث من خلال شرط معين:
User.objects.filter(pk__gt=4)
الكود السابق سوف يقوم بإرجاع كل المستخدمين الذين لديهم معرف id أكبر من 4
كما يمكنك أن تستعمل التابع in_bulk أيضًا:
User.objects.in_bulk([1, 2, 3, 4]) يأخذ هذا التابع قائمة بقيم الحقول و واسم الحقل الذي سيتم إستخدامه لفهرسة هذه القيم (يتم إستخدام الأرقام بشكل إفتراضي)، ويعيد قاموسًا يعين كل قيمة إلى instance من الكائن بقيمة الحقل المحددة.
-
إجابة سامح أشرف سؤال في كيف يمكنني الترتيب تنازليًا حسب عمود معين في Django؟ كانت الإجابة المقبولة
يمكنك أن تقوم بذلك بعدة طريق، منها:
ضع علامة - قبل اسم الحقل، كالتالي: User.objects.all().filter(role='user').order_by('-created_at') هنا يتم جلب النتائج من قاعدة البيانات بشكل عكسي أي من خلال جملة ORDER BY DESC في SQL، وتعد هذه هي الطريقة الأسرع في تنفيذ المهمة.
إستخدم التابع reverse()، كالتالي: User.objects.all().filter(role='user').order_by('created_at').reverse() هنا يتم جلب البيانات بترتيب تصاعدي، ثم يقوم Django بعكس ترتيب النتائج.
إستخدم ترتيب القائمة العكسي، كالتالي: User.objects.all().filter(role='user').order_by('created_at')[::-1] تستخدم هذه الطريقة فقط إن أردت تحويل النتائج إلى قائمة list وليس queryset.
-
إجابة سامح أشرف سؤال في أفضل كتاب لتعلم البرمجه باللغه الإنجليزية كانت الإجابة المقبولة
يوجد مجموعة من الكتب الإنجليزية لتعلم بايثون ومنها:
كتاب Think Python: كتاب مجاني ومناسب للمبتدئين، هو عبارة عن مقدمة لبرمجة Python للمبتدئين. يبدأ بالمفاهيم الأساسية للبرمجة، وهو مصمم بعناية لتحديد جميع المصطلحات عند استخدامها لأول مرة ولتطوير كل مفهوم جديد في تقدم منطقي. يتم تقسيم الأجزاء الأكبر حجمًا، مثل البرمجة الموجهة والكائنات العودية recursion إلى سلسلة من الخطوات الأصغر ويتم تقديمها على مدار عدة فصول. كتاب How to Code in Python: كتاب مجاني أيضًا، كتاب مقدم من شركة DigitalOcean (شركة مختصة في الإستضافة والتخزين السحابي)، تم تصميم هذا الكتاب ليتم استخدامه بطريقة منطقية بالنسبة للمبتدئ. بمجرد أن تتعرف على المفاهيم الأساسية المشروحة في الكتاب، يمكنك الاستمرار في استخدام الكتاب كمصدر مرجعي. كتاب Python for Everybody: الهدف من هذا الكتاب المجاني هو تقديم مقدمة في البرمجة. في هذا الكتاب يتم التركيز بشكل أكبر على استخدام Python لحل مشكلات تحليل البيانات الشائعة في عالم المعلوماتية. ملاحظة: تحتوي الأكاديمة على كتاب البرمجة بلغة بايثون، وهو كتاب مترجم إلى العربية مبني على كتاب «How to code in Python» ويأتي شارحًا المفاهيم البرمجية الأساسية بلغة بايثون، رُبط هذا الكتاب مع توثيق لغة بايثون في موسوعة حسوب لتسهيل عملية الاطلاع على أي جزء من اللغة مباشرة وقراءة التفاصيل باللغة العربية.
كما يوجد مجموعة ضخمة من المقالات في Python يمكنك الإطلاع عليها من هنا (مقالات بايثون).
-
إجابة سامح أشرف سؤال في إستخدام المعامل OR نموذج جانغو Django؟ كانت الإجابة المقبولة
يمكنك أن تستعمل الكائن Qمع علامة pipe | كالتالي:
from django.db.models import Q Post.objects.filter(Q(creator='owner') | Q(accepted=True)) أو يمكنك أن تقوم بإستخدام علامة pipe | بشكل مباشر كالتالي:
posts = Post.objects.filter(post.creator = 'owner') | Post.objects.filter(post.accepted = True)
-
إجابة سامح أشرف سؤال في تطبيق جملة GROUP BY في نموذج في جانغو Django؟ كانت الإجابة المقبولة
يمكنك أن تقوم بعمل تجميع aggregation من خلال التابع count كالتالي:
# يجب إستدعاؤ التابع أولًا # في حالة تم إستدعاء models مسبقًا فيمكنك أن تستخدمه أيضًا from django.db.models import Count result = (User.objects .values('role') .annotate(dcount=Count('role')).order_by() ) الكود السابق يقوم بتنفيذ جملة SQL التالية:
SELECT role, COUNT(role) AS dcount FROM users GROUP BY role وسوف تكون النتيجة كالتالي:
[{'role': 'Admin', 'dcount': 2}, {'role': 'User', 'dcount': 2}] إن أردت أن تحتوي النتيجة على أكثر من حقل، فيجب أن تقوم بإضافتهم إلى values كالتالي:
.values('role', 'name', 'age') وهناك دائمًا حل آخر بديل وهو أن تقوم بتنفيذ جملة SQL فقط كالتالي:
result = User.objects.raw('''SELECT * FROM users GROUP BY role''') لكن لا ينصح إستخدام هذا الحل، لأن جمل SQL المباشرة قد تؤدي إلى حدوث مشاكل أمنية وأخطاء غير متوقعه في كثير من الأحيان.
-
إجابة سامح أشرف سؤال في أين يتم تخزين أخطاء جانغو Django مع Nginx؟ كانت الإجابة المقبولة
بشكل إفتراضي يتم تخزين السجلات logs في نظام Linux في أحد المسارات التالية (حسب بنية النظام لديك):
/var/log/nginx/nginx_error.log /var/log/nginx/error.log يمكنك عرض آخر جزء من السجل من خلال أمر tail، كالتالي:
tail -f /var/log/nginx/error.log لاحظ: يجب تغير المسار في الأمر السابق حسب المسار الذي لديك
أما في MacOS فالمسار مختلف وهو:
/usr/local/var/log/nginx أما في Windows فيختلف المسار حسب مكان تثبيت الخادم لكن يمكنك الوصول من خلال تنفيذ الأمر التالي:
nginx -s reopen أما إن أردت أن يقوم Django بحفظ السجلات فيجب عليك أن تقوم بتعديل ملف settings.py لشمل الكود كالتالي:
LOGGING = { 'version': 1, 'disable_existing_loggers': False, 'handlers': { 'file': { 'level': 'DEBUG', 'class': 'logging.FileHandler', 'filename': os.path.join(BASE_DIR, 'debug.log'), }, }, 'loggers': { 'django': { 'handlers': ['file'], 'level': 'DEBUG', 'propagate': True, }, }, }
-
إجابة سامح أشرف سؤال في عند إيقاف وضع التطوير في جانغو Django لا يمكن الوصول إلى الصور أو ملفات CSS؟ كانت الإجابة المقبولة
مع إيقاف وضع التطوير Debug mode، لن يتعامل Django مع الملفات الثابتة بعد الآن، حيث يجب أن يتولى خادم الويب الخاص بالإنتاج (Apache أو Nginx) هذا الأمر، وذلك لكي يتم تحميل الملفات الثابتة Static Files بشكل أسرع، حيث يقوم خادم الويب بتحميل الملفات بشكل مباشر دون المرور على طبقة الكود الخاص بالموقع، مما يعني سرعة تحميل أسرع بشكل عام.
يمكنك حل المشكلة بشكل مؤقت أثناء التطوير من خلال تشغيل الخادم مع تمرير العلم insecure كالتالي:
manage.py runserver --insecure باستخدام العلم insecure، فيجب أن تعلم أنه غير فعال بشكل كبير وربما غير آمن أيضًا. لأن هذا الأمر مخصص للتطوير المحلي فقط local development، ويجب عدم استخدامه مطلقًا في مرحلة الإطلاق Production، وهو متاح فقط إذا كان تطبيق الملفات الثابتة staticfiles موجود في قائمة INSTALLED_APPS الخاص بمشروعك (في ملف settings.py).
-
إجابة سامح أشرف سؤال في الحصول على عنوان URL الكامل في جانغو Django؟ كانت الإجابة المقبولة
يمكنك أن تستعمل الدالة build_absolute_uri() للحصول على عنوان URL المطلق للصفحة الحالية، كالتالي:
>>> request.build_absolute_uri() 'https://example.com/posts/slug/how-to-create-django-project/?color=dark' وإن قمت بتمرير عنوان نسبي relative، سوف تعيد الدالة العنوان المطلق absolute URL، كالتالي:
>>> request.build_absolute_uri('/posts/slug/') 'https://example.com/posts/slug//' ويمكنك أيضًا أن تقوم بتحديد النطاق domain كالتالي:
>>> request.build_absolute_uri('https://anotherSite.com/posts/slug/') 'https://anotherSite.com/posts/slug//' لاحظ أن البروتوكول المستعمل هو نفسه في النتيجة، لذا يجب عليك الحذر في حالة إستعمال برتوكول http غير المشفر.
-
إجابة سامح أشرف سؤال في كيف أجعل جانغو Django يستخدم MySQL بدلًا من SQLite؟ كانت الإجابة المقبولة
لكي يعمل Django مع MySQL يجب تثبيت حزمة إضافةي وهي mysqlclient (لـ بايثون 3) أو mysql-python (لـ بايثون 2)، ويمكنك أن تقوم بتثبيتها من خلال الأمر التالي:
pip install mysql-python # (python 2) pip install mysqlclient # (python 3) وإن كنت تستعمل نظام التشغيل لينكس (مبني على توزيعة Debian مثل Ubuntu أو Mint) فيمكنك أن تستخدم الأمر التالي:
apt-get install python-mysqldb كما يجب عليك تعديل إعدادات المشروع لكي يستخدم MySQL من خلال ملف settings.py، كالتالي:
DATABASES = { 'default': { 'ENGINE': 'django.db.backends.mysql', # تخبر Django بأن يستعمل محرك MySQL 'NAME': 'django', 'HOST': '', # نص فارغ يعني localhost 'PORT': '3306', 'USER': 'root', 'PASSWORD': '', } } ملاحظة: يمكنك حفظ معلومات المستخدم الخاص بقاعدة البيانات في ملف my.cnf على سبيل المثال، كالتالي:
DATABASES = { 'default': { 'ENGINE': 'django.db.backends.mysql', 'OPTIONS': { 'read_default_file': '/path/to/my.cnf', }, } }
-
إجابة سامح أشرف سؤال في كيفية إستبعاد القيم الفارغة و قيم Null في QuerySet في جانغو Django؟ كانت الإجابة المقبولة
يمكنك أن تستعمل التابع exclude كالتالي:
User.objects.exclude(nickName__isnull = True) إذا كنت بحاجة إلى استبعاد القيم الفارغة أيضًا، فبإمكانك القيام بذلك من خلال تجميع الشروط معًا مثل:
User.objects.exclude(nickName__exact = "").exclude(nickName__isnull = True) في الكود السابق سوف يتم إستبعاد كل القيم الفارغة أو التي تساوي Null
يمكنك أيضًا أن تستعمل التابع Filter كالتالي:
User.objects.filter(nickName__isnull = False, nickName__gt = "") يقوم الكود السابق بنفس الشيء وستحصل على نفس النتيجة
-
إجابة سامح أشرف سؤال في مكتبة Pygame كانت الإجابة المقبولة
يمكنك أن تتحكم في الشفافية الخاصة بلون أي خط من خلال تمرير قيمة Alpha كعنصر ثالث عند كتابة لون الخط، كالتالي:
import pygame pygame.init() # تحديد خصائص النافذة size = [600, 600] screen = pygame.display.set_mode(size) screen.fill((255, 255, 255)) vertical_line = pygame.Surface((100, 600), pygame.SRCALPHA) vertical_line.fill((0, 0, 255, 50)) # يمكنك أن تقوم بتغير رقم 50 إلى أي رقم بين 0 و 255 screen.blit(vertical_line, (0, 0)) horizontal_line = pygame.Surface((600, 100), pygame.SRCALPHA) horizontal_line.fill((255, 0, 0, 50)) # يمكنك أن تقوم بتغير رقم 50 إلى أي رقم بين 0 و 255 screen.blit(horizontal_line, (0, 0)) يقوم الكود السابق بعمل خطين أحدهما أحمر والثاني أزرق وعندما يتلاقى الخطين (في أعلى اليسار) ستجد مربع لونه بنفسجي، كما في الصورة:
أو يمكنك أن تستعمل التابع set_alpha أيضًا للحصول على نفس النتيجة كالتالي:
vertical_line = pygame.Surface((100, 600), pygame.SRCALPHA) vertical_line.set_alpha(50) # يمكنك أن تقوم بتغير رقم 50 إلى أي رقم بين 0 و 255 vertical_line.fill((0, 0, 255)) screen.blit(vertical_line, (0, 0)) horizontal_line = pygame.Surface((600, 100), pygame.SRCALPHA) horizontal_line.set_alpha(50) # يمكنك أن تقوم بتغير رقم 50 إلى أي رقم بين 0 و 255 horizontal_line.fill((255, 0, 0)) screen.blit(horizontal_line, (0, 0)) الأمثلة السابقة للتوضيح وبالتأكيد سوف تحتاج إلى حلقة لكي لا تغلق النافذة تلقائيًا.
مكتبة Pygame ليست معدة لعمل تطبيقات أندرويد بل لعمل الألعاب البسيطة على أنظمة التشغيل الخاصة بالحسوب مثل Windows و Linux و MacOS، كما أنه لا ينصح إستعمال لغة Python على العموم في عمل تطبيقات الهاتف، حيث أن هناك تقنيات أخرى أفصل وأسهل ومعدة خصيصًا لهذا الأمر مثل Flutter أو React Native أو حتى إستعمال لغات مثل Java و Swift لعمل تطبيقات أندرويد و iOS ، لكن هذا لا يمنع أنه يمكن إستخدام لغة بايثون لعمل تطبيقات الأندرويد، حيث يمكن إستعمال مكتبات مثل Kivy (التي تدعم شاشات اللمس، وتعدد الأصابع على الشاشة) لعمل تطبيقات أندرويد.
نعم، يمكنك أن تستعمل مكتبات مثل arabic-reshaper للكتابة باللغة العربية في نافذة Pygame، أولًا يجب أن تقوم بتثبيت المكتبة عبر الأمر التالي:
pip install --upgrade arabic-reshaper وإن كنت تستعمل anaconda فيمكنك أن تستعمل الأمر:
conda install -c mpcabd arabic-reshaper بعد تثبيت المكتبة يجب أن تقوم بتثبيت حزمة python-bidi أيضًا من خلال الأمر التالي:
pip install python-bidi وأخيرًا ستحتاج إلى خط يدعم العربية مثل خط Cairo ويمكنك تحميله من خلال خطوط جوجل من هنا، وفي النهاية يجب أن تقوم بتمرير النص إلى التابع reshape من مكتبة arabic-reshaper ثم يجب تمرير النتيجة إلى الدالة get_display من حزمة python-bidi وأخيرًا تستطيع عرض النص في النافذة:
import pygame import arabic_reshaper from bidi.algorithm import get_display pygame.display.init() pygame.font.init() win = pygame.display.set_mode((500, 500)) font = pygame.font.Font('Cairo-Regular.ttf', 20) # اسم ومسار الخط وحجم الخط # هنا النص الذي ترغب بعرضه text_to_be_reshaped = 'نص باللغة العربية' # عملية تحويل النص reshaped_text = arabic_reshaper.reshape(text_to_be_reshaped) bidi_text = get_display(reshaped_text) print(reshaped_text) text = font.render(bidi_text, True, (255, 255, 255)) win.fill((0, 0, 0)) win.blit(text, (0, 0)) النتيجة:
-
إجابة سامح أشرف سؤال في مشكلة تحديث جانغو Django في بيئة virtualenv عبر pip كانت الإجابة المقبولة
يبدو أنك تستعمل إصدار قديم نوعًا ما من مدير الحزم pip، لذلك لا يتم تحديث مطلبات Django أيضًا، ولحل هذه المشكلة يجب عليك أولًا تحديث pip عبر الأمر التالي:
pip install --upgrade pip وإن كنت تستعمل ويندوز فيمكنك أن تستعمل الأمر التالي:
python -m pip install --upgrade pip بعد ذلك يمكنك تحديث كل الحزم من خلال الأمر التالي:
pip install -r requirements.txt --upgrade وإن أردت تحديث حزمة Django فقط (وإعتماديات الحزمة dependencies) ففي الإصدار الحديث من pip يقوم بذلك تلقائيًا عبر الأمر التالي:
pip install Django --upgrade أما إن لم تكن ترغب في تحديث الإعتماديات فيمكنك أن تضيف العلم --upgrade-strategy إلى الأمر الأخير، ولكن لا ينصح بعمل هذا الأمر لأنه قد يسبب الكثير من المشاكل لاحقًا.
-
إجابة سامح أشرف سؤال في ما هي فائدة related_name في حقول النموذج في جانغو Django؟ كانت الإجابة المقبولة
تقوم الخاصية related_name بتحديد اسم العلاقة العكسية بين النموذج Answer و النموذج Question، وإذا لم تقم بتحديد هذه الخاصية سوف يقوم Django بتوليد اسم من خلال إضافة _set إلى اسم النموذج لتصبح النتيجة Answer.question_set
على سبيل المثال، إذا كان لديك كائن مستخدم first_answer، فيمكنك استخدام first_answer.questions.all () للحصول على جميع مثيلات نموذج السؤال التي لها علاقة بالسؤال الأول.
بالطبع بإمكانك إستخدامه بعده أشكال كعادة باقي العلاقات العادية:
q = answer.questions.all().order_by('-creation_time')
-
إجابة سامح أشرف سؤال في فائدة on_delete في النماذج في جانغو Django؟ كانت الإجابة المقبولة
في لغة SQL يُعد هذا هو السلوك الذي يجب اعتماده عند حذف الكائن المشار إليه. وهذه ليست خاصة في Django نفسه. بل هو جزء من SQL.
يتم استخدام on_delete لإخبار Django بما يجب فعله مع النموذج التي تعتمد على كائنات أخرى الذي قمت بحذفه. (على سبيل المثال، علاقة ForeignKey)، مثلًا المنشور الواحد في مدونة ما قد يكون له علاقة ForeignKey مع جدول comments لعرض التعليقات الخاصة بمنشور معين، وهذه الخاصية هي التي تحدد ما الذي سيحدث في حالة حذف المنشور، هل سيتم حذف التعليقات أم إبقائها أم ربما تريد إظهار خطأ يمنعك من حذف أي منشور لديه تعليقات عن طريق الخطأ.
وهناك سبعة إجراءات يمكن اتخاذها عند وقوع مثل هذا الحدث (أي عند حذف كائن من جدول ما):
CASCADE: عند حذف الكائن المشار إليه، احذف أيضًا الكائنات التي لها مراجع (عندما تقوم بإزالة منشور من مدونة ما على سبيل المثال، قد ترغب في حذف التعليقات الخاصة بهذا المنشور أيضًا).في لغة SQL يتم إستعمال كلمة CASCADE PROTECT: منع حذف الكائن المشار إليه (إن كان هناك أي إشارات له من كائنات أخرى). ولحذفه، سيتعين عليك حذف جميع الكائنات التي تشير إليه يدويًا، في لغة SQL يتم إستعمال كلمة RESTRICT RESTRICT: (تم إضافتها في الإصدار 3.1 من Django)، تشبه الخيار السابق، ولكنها تتبع معيار لغة SQL بشكل أدق، وفي حالة حدوث خطأ يتم عرض خطأ من نوع RestrictedError ، بخلاف PROTECT، تسمح بحذف الكائن المشار إليه إذا كان يشير أيضًا إلى كائن مختلف يتم حذفه في نفس العملية، ولكن عبر علاقة CASCADE. SET_NULL: يتم تعيّن المرجع إلى NULL (يتطلب أن يكون الحقل nullable أي أن قيمة null تساوي True). على سبيل المثال، عندما تحذف مستخدمًا، قد ترغب في الاحتفاظ بالتعليقات التي نشرها في منشورات المدونة، ويتم عرض التعليقات من قِبل مستخدم مجهول أو تم حذفه. في لغة SQL يتم إستعمال كلمة SET NULL SET_DEFAULT: يقوم بتعيين القيمة الافتراضية default. في لغة SQL يتم إستعمال كلمة SET DEFAULT SET(): تقوم بتعيين قيمة معينة. هذا ليس جزءًا من معيار SQL ويتم التعامل معه بالكامل بواسطة Django فقط، وهنا مثال لكيفية إستخدامها من توثيق Django الرسمي: from django.conf import settings from django.contrib.auth import get_user_model from django.db import models def get_sentinel_user(): return get_user_model().objects.get_or_create(username='deleted')[0] class MyModel(models.Model): user = models.ForeignKey( settings.AUTH_USER_MODEL, on_delete=models.SET(get_sentinel_user), )
DO_NOTHING: يتم إستخدامها للإشارة إلى كائن غير موجود بالفعل، وقد تسبب الكثير من المشاكل في قاعدة البيانات مما ينتج عنه مشاكل وأخطاء تظهر للمستخدمين، في لغة SQL يتم إستعمال NO ACTION يمكنك الوصول إلى توثيق كل الخيارات السابقة في وثائق Django من هنا.
في أغلب الحالات، CASCADE هو الخيار الأكثر إستخدامًا، ولكن بالنسبة لكل مفتاح ForeignKey، يجب أن تسأل نفسك دائمًا ما هو السلوك المتوقع في هذا الموقف. أحيانًا ما يكون PROTECT و SET_NULL مفيدًا في بعض الحالات.
تحتوي الأكاديمية على مقالة (النماذج Models والاستعلام عن البيانات في Django) تمكنك من تجهيز وإعداد نماذج في Django وتتضمن أيضًا عمل علاقة ForeignKey بين النماذج.
-
إجابة سامح أشرف سؤال في كيفية الحصول على المدخلات parameters من request.GET في جانغو Django؟ كانت الإجابة المقبولة
يمكنك الحصول على أي Query Parameter من خلال التابع get كالتالي:
// URL: localhost:8000/posts?id=123 request.GET.get('id', '1') # Output: 123 يتم تمرير اسم الـ Parameter إلى التابع get والقيمة الثانية هي القيمة الإفتراضية التي سوف يتم إستخدامها في حالة لم يتم إيجاد اي parameter باسم id.
على العموم إن كنت تريد إستخدام regex، فيمكنك أن تستخدم re_path كالتالي:
from django.urls import path, re_path from . import views urlpatterns = [ path('posts/2003/', views.special_case_2003), re_path(r'^posts/(?P<year>[0-9]{4})/$', views.year_archive), ] وعليك أن تقوم بتجهيز views.py كالتالي:
def post_page(request, year): # Rest of the method
-
إجابة سامح أشرف سؤال في كيف اقرأ اكواد المكتبات في بايثون كانت الإجابة المقبولة
بإمكانك قراءة توثيق أي مكتبة من خلال الدالة help والتي قد تساعدك كثيرًا في فهم كيفية عمل المكتبة من خلال توثيق مكتوب باللغة الإنجليزية، مما يعطيك لمحة حول الدوال والمتغيرات والأصناف الموجودة في هذه المكتبة، يمكنك أن تقوم بإستخدام الدالة help كالتالي:
>>> help('numpy') Help on package numpy: NAME numpy DESCRIPTION NumPy ===== Provides 1. An array object of arbitrary homogeneous items 2. Fast mathematical operations over arrays 3. Linear Algebra, Fourier Transforms, Random Number Generation How to use the documentation ---------------------------- Documentation is available in two forms: docstrings provided with the code, and a loose standing reference guide, available from `the NumPy homepage <https://www.scipy.org>`_. We recommend exploring the docstrings using `IPython <https://ipython.org>`_, an advanced Python shell with TAB-completion and introspection capabilities. See below for further instructions. The docstring examples assume that `numpy` has been imported as `np`:: >>> import numpy as np -- More -- لاحظ أن توثيق أغلب المكتبات كبير للغاية لذلك يتم عرض جزء صغير فقط ويمكنك أن تقوم بعرض المزيد من خلال الضغط على Enter.
كما يمكنك أن تستعمل نفس الدالة لقراءة توثيق دالة ميعنة أو صنف معين من خلال كتابة اسم المكتبة ثم اسم الدالة أو الصنف ويفصلهما نقطة، كالتالي:
>>> help('numpy.array') Help on built-in function array in numpy: numpy.array = array(...) array(object, dtype=None, *, copy=True, order='K', subok=False, ndmin=0, like=None) Create an array. Parameters ---------- object : array_like An array, any object exposing the array interface, an object whose __array__ method returns an array, or any (nested) sequence. dtype : data-type, optional The desired data-type for the array. If not given, then the type will be determined as the minimum type required to hold the objects in the sequence. copy : bool, optional If true (default), then the object is copied. Otherwise, a copy will only be made if __array__ returns a copy, if obj is a nested sequence, or if a copy is needed to satisfy any of the other requirements (`dtype`, `order`, etc.). order : {'K', 'A', 'C', 'F'}, optional Specify the memory layout of the array. If object is not an array, the newly created array will be in C order (row major) unless 'F' is specified, in which case it will be in Fortran order (column major). If object is an array the following holds. ===== ========= =================================================== -- More -- للخروج من التوثيق يمكنك الضغط على q أو Ctrl + c فقط.
ولطباعة محتوى مكتبة معينة يمكنك أن تستعمل دالة open والتابع __file__ لقراءة ملفات المكتبة ثم طبعاتها، كالتالي:
>>> import flask >>> f = open(flask.json.__file__, 'r') >>> content = f.read() >>> print(content) بالتأكيد فتح ملفات المكتبة وتصفحها سيكون أفضل وأسهل وأكثر عملية، ويمكنك الحصول على مسار أي مكتبة من خلال التابع __file__ أيضًا كالتالي:
>>> flask.__file__ 'C:\\Python38\\lib\\site-packages\\flask\\__init__.py'
-
إجابة سامح أشرف سؤال في خطأ عند ارسال ايميل Call to undefined function mb_strcut() كانت الإجابة المقبولة
يحتاج Laravel مجموعة من المتطلبات لكي يعمل بشكل سليم، ومن ضمنها تثبيت وإعداد mbstring extension لتعمل مع php، ويمكنك أن تتأكد من تثبيتها من خلال الأمر التالي:
php -m | grep mb إذا لم تظهر mbstring، فيجب أن تقوم بتثبيتها من خلال الأمر التالي:
sudo apt-get install php-mbstring أما إذا ظهرا في نتيجة الأمر الأول، فيجب أن تقوم بتعديل ملف php.ini لكي تقوم بتشغيل الإضافة، وذلك من خلال البحث عن كلمة mbstring في ملف php.ini ومن المفترض أن تجدها بالشكل التالي لكي تعمل:
extension=mbstring ملاحظة في حالة كان السطر يبدأ بـفاصلة منقوطة ; فيجب حذف هذه العلامة لكي تعمل الإضافة.
في حالة لم يكن بإمكانك تنفيذ الأوامر على الإستضافة الحالة فيجب عليك التواصل مع مقدم خدمة الإستضافة لكي يقوم بتفعيل هذه الإضافة.
يمكنك الإطلاع على هذه المقالة من هنا (تثبيت Laravel وإعداده على Windows وUbuntu) لمعرفة كل متطلبات Laravel لكي يعمل بشكل سليم.