سامح أشرف
-
المساهمات
2934 -
تاريخ الانضمام
-
تاريخ آخر زيارة
-
عدد الأيام التي تصدر بها
56
إجابات الأسئلة
-
إجابة سامح أشرف سؤال في كيفية إرجاع خطأ Forbidden في جانغو Django؟ كانت الإجابة المقبولة
يمكنك إعادة رد بكود 403 في جانغو من خلال الكود التالي:
from django.core.exceptions import PermissionDenied def my_view(request, ...): if not request.user.is_admin: raise PermissionDenied بالطبع يمكنك تغير الشرط في الكود السابق كما تريد.
على عكس الخطأ HttpResponseForbidden، يؤدي إعادة PermissionDenied إلى عرض رسالة الخطأ باستخدام القالب 403.html ، أو يمكنك استخدام middleware لإظهار ملف عرض مخصصة.
كما يمكنك عرض رسالة خطأ مخصصة، على النحو التالي:
from django.core.exceptions import PermissionDenied def my_view(request, ...): if not request.user.is_admin: raise PermissionDenied("You do not have permission to visit this page") -
إجابة سامح أشرف سؤال في الحصول على عنوان URL الخاص بلوحة التحكم لكائن معين في جانغو Django؟ كانت الإجابة المقبولة
يمكنك الحصول عنوان URL مباشرة في القالب template، ولا داعي لكتابة أي filter لعمل ذلك.
<a href="{% url 'admin:index' %}">Admin Index</a> كما يمكنك تمرير عض المعاملات كالتالي:
<a href="{% url 'admin:posts_comment_add' comment.id %}">Add comment</a> أيضًا يمكنك أن تستعمل الدالة reverse ولكن بشكل آخر عن الإصدارات القديمة، على النحو التالي:
from django.urls import reverse c = Comment.objects.get(...) change_url = reverse('admin:posts_comment_change', args=(c.id,)) كما يمكنك عمل تابع في النموذج مباشرة لكي ييقوم بإعادة عنوان URL الخاص بالنموذج في لوحة التحكم:
from django.urls import reverse def get_admin_url(self): return reverse(f'admin:{self._meta.app_label}_{self._meta.model_name}_change', args=[self.id])
-
إجابة سامح أشرف سؤال في خطأ global name 'profile__level' is not defined في جانغو Django كانت الإجابة المقبولة
في جانغو Django لا يتم التصفية بإستخدام علامة أقل من > أو أكبر من <، ولكن تستخدم اسم الحقل مع lte أو gte، كالتالي:
أقل من أو يساوي:
users = User.objects.filter(profile__level__lte=0) أكبر من أو يساوي:
users = User.objects.filter(profile__level__gte=0) وإذا لم تريد أن تحصل على الكائنات التي تساوي هذه القيمة، أي أنك تريد أن تستخدم أقل من (وليس أقل من أو يساوي)، فكل ما عليك فعله هو حذف حرف e في نهاية اسم الخاصية، ليكون الكود كالتالي:
أقل من:
users = User.objects.filter(profile__level__lt=0) أكبر من:
users = User.objects.filter(profile__level__lg=0)
-
إجابة سامح أشرف سؤال في ما فائدة semantic tags في html5؟ كانت الإجابة المقبولة
أغلب العناصر من نوع semantic لا تختلف عن عنصر div وقد لا تضيف أي جديد للصفحة، لكن بالرغم من ذلك ينصح بإستخدام هذه العناصر كلما سنحت لك الفرصة وذلك لأن لها فائدة في تحسين السيو SEO الخاص بموقعك، وذلك لأن محركات البحث سوف تفهم تكوين الصفحة بشكل أكبر، فعنصر nav سيُفهم على أنه شريط التنقل الخاص بالموقع، وعنصر footer سيوضح آخر جزء من الصفحة .. إلخ.
أيضًا سوف يساعد فئة من المستخدمين في تصفح الموقع، حيث يستعمل بعض المستخدمين أجهزة قارئ الشاشة (أجهزة مخصصة تساعد ذوي الإعاقات أو ضعيفي النظر .. إلخ في تصفح الإنترنت)، وبالتالي عندما يكون موقعك مبني بطريقة صحيحة من خلال عناصر semantic مناسبة سيكون الأمر أسهل على هذه الفئة من المستخدمين.
كما أن إستخدام هذه العناصر سيسهل عليك عملية التطوير لأنك ستعرف مكان وفائدة الكود بمجرد النظر إلى اسم العنصر، في الماضي (في HTML 4 وما قبلها) كان يتم إستعمال عنصر div بكثرة لكي يتم إنشاء الأجزاء الرئيسية والفرعية في الموقع وكنتيجة لهذا الأمر كانت الصفحة ممتلئة بعناصر div مع أستعمال أصناف Classes ومعرفات IDs كثيرة ويصبح فهم الكود أصعب كلما زاد حجم الصفحة، لكن بعد ظهر عناصر semantic أصبح الأمر أسهل بكثير.
يمكنك أن تلقي نظرة على هذه الإجابة التي تشرح إستخدام مجموعة من عناصر semantic وأين يتم إستعمالها في الصفحة:
-
إجابة سامح أشرف سؤال في استبدال الدورة أو استرجاع المال كانت الإجابة المقبولة
يمكنك التواصل مع فريق الدعم الفني لإستبدال الدورة بدورة أخرى من الدورات الموجودة في الأكاديمية أو حتى لإسترجاع الأموال.
تستطيع زيارة الدعم الفني الخاص بالأكاديمية من هنا.
-
إجابة سامح أشرف سؤال في الفرق بين values و values_list في جانغو Django كانت الإجابة المقبولة
التابع values يقوم بإعادة QuerySet تحتوي على قواميس dictionaries، وتكون نتيجته كالتالي:
<QuerySet [{'comment_id': 1}, {'comment_id': 2}]> بينما التابع values_list يقوم بإعادة كائن QuerySet يحتوي على tuples، وتكون نتيجته كالتالي:
<QuerySet [(1,), (2,)]> إذا كنت تستخدم التابع values_list لإعادة حقل واحد فيمكنك أن تضع الخاصية flat بقيمة true لإعادة كائن QuerySet يحتوي على كل المعرفات في شكل قيمة واحدة بدلًا من tuple، كالتالي:
<QuerySet [1, 2]>
-
إجابة سامح أشرف سؤال في خطأ MultiValueDictKeyError في جانغو Django كانت الإجابة المقبولة
يحدث هذا الخطأ لأن المتصفح لا يقوم بإرسال حقل checkbox إن لم تكن محددًا، وبالتالي لا يوجد مفتاح باسم is_published في القاموس request.POST، لذلك يمكنك أن تستخدم التابع get الموجود في أي قاموس dictionary والذي يسمح لك يتمرير قيمة إفتراضية في حالة عدم وجود المفتاح في القاموس، كالتالي:
is_published = request.POST.get('is_published', False) أو يمكنك عمل ذلك من خلال جملة if .. else، على النحو التالي:
if 'is_published' in request.POST: is_published = request.POST['is_published'] else: is_published = False ويمكن إختصار الكود السابق في سطر واحد، كالتالي:
is_published = 'is_published' in request.POST and request.POST['is_published'] كما يمكنك أن تستخدم جملة try ... except:
from django.utils.datastructures import MultiValueDictKeyError try: is_published = request.POST['is_published'] except MultiValueDictKeyError: # في حالة لم يوجد المفتاح is_published is_published = False
-
إجابة سامح أشرف سؤال في كيفية ربط النصوص في قوالب جانغو Django؟ كانت الإجابة المقبولة
يمكنك أن تستخدم جملة with على النحو التالي:
{% with "posts/"|add:myVar|add:"/base.html" as template %} {% include template %} {% endwith %} لكن الطريقة الأفضل هي أن تقوم بعمل وسم مخصص لهذا الأمر كالتالي:
أولًا قم بعمل ملف يف المسار:
<yourAppName>\templatetags\<yourAppName>_extras.py ثانيًا في هذا الملف قم بعمل وسم مخصص على النحو التالي:
from django import template register = template.Library() @register.filter def addStr(str1, str2): return str(str1) + str(str2) والآن أصبح بإمكانك أن تستخدم هذا الوسم على كالتالي:
{% load <YourAppName>_extras %} {% with "posts/"|addstr:myVar|addstr:"/base.html" as template %} {% include template %} {% endwith %}
-
إجابة سامح أشرف سؤال في ضمان استرداد الاستثمار في دورة واجهة المستخدم كانت الإجابة المقبولة
تضمن لك أكاديمية حسوب بإسترداد استثمارك خلال 6 أشهر، وأنا أقتبس هنا من مركز المساعدة الخاص بالأكاديمية:
كما يمكنك التواصل مع فريق الدعم الفني للحصول على المساعدة أو الاستفسار بشكل أكبر من خلال هذا الرابط (مركز مساعدة أكاديمية حسوب).
-
إجابة سامح أشرف سؤال في ما هو الكوبون في دورات أكاديمية حسوب كانت الإجابة المقبولة
يمكنك التواصل مع مع فريق الدعم الفني، وسؤالهم بهذا الخصوص، للتواصل مع الدعم الفني يمكنك أن تستخدم مركز المساعدة من هنا.
-
إجابة سامح أشرف سؤال في كيفية إضافة placeholder إلى حقل CharField في جانغو Django كانت الإجابة المقبولة
يمكنك أن تقوم بذلك من خلال :
query = forms.CharField(label = 'search', widget = forms.TextInput(attrs = {'placeholder': 'Search'})) حيث تقبل widget كائن من نوع TextInput والذي بدوره يمكنك من الحصول على قيمة أي خاصية مثل placeholder على سبيل المثال.
والطريقة الأخرى لعمل نفس الشيء هي إستخدام صنف Meta، كالتالي:
from django import forms from .models import SearchModel class SearchForm(forms.ModelForm): class Meta: model = SearchModel widgets = { 'name': forms.TextInput(attrs={'placeholder': 'Search'}), }
-
إجابة سامح أشرف سؤال في خطأ No module named 'django.core.urlresolvers' في جانغو Django كانت الإجابة المقبولة
تم إزال الموديول django.core.urlresolvers من جانغو بداية من الإصدار 2.0، وبدلًا من ذلك تم يجب إستخدام django.urls، لذلك يجب تغير كل جمل import لكي تبدو على النحو التالي:
from django.urls import reverse لاحظ أن الإصدار 2.0 من جانغو Django يزيل بعض الميزات التي كانت موجودة سابقًا في django.core.urlresolvers، لذلك قد تضطر إلى إجراء المزيد من التغييرات قبل أن يعمل الكود الخاصة بك. يمكنك أن تستخدم توثيق جانغو Django لمراجعة الميزات التي تم إيقاف العمل بها في الإصدار 1.9 للحصول على تفاصيل حول هذه التغييرات الإضافية.
-
إجابة سامح أشرف سؤال في خطأ أثناء مقارنة الوقت والتاريخ في جانغو Django كانت الإجابة المقبولة
بشكل افتراضي، يكون كائن التاريخ والوقت في Python من نوع naive، لذلك تحتاج إلى جعل كلاهما إما كائنات naive أو aware. ويمكن القيام بذلك باستخدام:
import datetime import pytz utc = pytz.UTC post.datetime_start = utc.localize(post.datetime_start) post.datetime_end = utc.localize(post.datetime_end) # الآن كلا الحقلين من نوع aware, ويمكن المقارنة بينهما كما أن جانغو Django يقدم طريقة سهلة لكي تحصل على الوقت والتاريخ الحاليين بنفس الصيغة التي يستعملها من خلال التبع datetime.datetime.now، على النحو التالي:
from django.utils import timezone now = timezone.now() كما يمكنك أن تقوم بتحويل الوقت والتاريخ من صيغة UNIX من خلال الكائن datetime.datetime، كالتالي:
unix_time = int(unix_timestamp) d = datetime.datetime.utcfromtimestamp(unix_time) d_with_tz = datetime.datetime( year = d.year, month = d.month, day = d.day, hour = d.hour, minute = d.minute, second = d.second, tzinfo = pytz.UTC)
-
إجابة سامح أشرف سؤال في تمرير أكثر من كائن many-to-many في جانغو Django كانت الإجابة المقبولة
التابع add يقبل إدخال أكثر من كائن في نفس الوقت بالشكل التالي:
Users.m2mfield.add(obj1, obj2, obj3) أي أنه يجب أن تمرر الكائنات مباشرة إلى التابع add وليس تمرير قائمة من الكائنات.
إن كانت لديك قائمة من الكائنات وتريد تمرير محتوياتها فيمكنك أن تستخدم علامة * قبل القائمة على النحو التالي:
Users.m2mfield.add(*[obj1, obj2, obj3]) ولاحظ أن بهذه الطريقة لا يقوم جانغو Django يإستدعاء التابع save لكل كائن، ولكنه يستخدم التابع bulk_create، وبالتالي يتم تنفيذ جملة SQL واحدة فقط.
وفي حالة أردت أن تقوم بتحديث الكئانات الموجودة بالفعل في قاعدة البيانات، فيمكنك أن تستعمل التابع set والذي يقوم بحذف كل الكائنات الموجودة في هذه العلاقة (many-to-many)، وينشيئهم من جديد، وتستخدم على النحو التالي:
Users.m2mfield.set([obj1, obj2, obj3]) لاحظ أن التابع set يقبل تمرير قائمة من الكائنات بشكل مباشر (أي بدون وضع علامة * قبل القائمة).
-
إجابة سامح أشرف سؤال في أضرار تغيير الـ SECRET_KEY في مشروع جانغو Django كانت الإجابة المقبولة
يتم استخدام SECRET_KEY في العديد من الأماكن المختلفة في مشروغ جانغو Django، وسأوضح ما التأثيرات و الأضرار التي قد تحدث إذا قمت بتغيير الـ SECRET_KEY.
قائمة الأشياء التي تستخدم SECRET_KEY بشكل مباشر أو غير مباشر:
JSON object signing
دوال التشفير لـ salted hmacs أو دعم محرك توليد النصوص والأرقام العشوائية الذي يؤثر على كل من:
توليد رمز إعادة تعين كلمات السر password reset token (للمستخدمين والمسؤولين)
comment form security: لحماية الموقع من طلبات POST من مواقع غريبة
form security: حماية النماذج بشكل عام
message tampering، لأنه قد يستخدم ملفات الكوكيز Cookis لنقل البيانات بين ملفات العرض views
حماية الجلسات session data وعمل مفاتيح عشوائية للجلسات session keys
توليد random salt من أجل إستخدامها في دوال الهاش password hashers
توليد كلمات مرور عشوائية passwords، إذا تطلب الأمر
عمل مفتاح CSRF
ما سوف يتغير عند المستخدم بشكل مباشر عند تغيير قيمة SECRET_KEY هي:
الجلسات، سيتم كسر فك تشفير البيانات، وهو صالح لأي خلفية جلسة (ملفات تعريف الارتباط أو قاعدة البيانات أو الملفات المستندة إلى ذاكرة التخزين المؤقت). لن يعمل رمز إعادة تعيين كلمة المرور الذي تم إرساله بالفعل لأي مستخدم، وسيتعين على المستخدمين طلب رمز جديد.
لن يتم التحقق من صحة نموذج التعليقات (في حالة استخدام django.contrib.comments) إذا تم طلبه قبل تغيير القيمة (أي إذا تم تحمليه في المتصفح ثم تم تغير الـ SECRET_KEY) وتقديمه بعد تغيير القيمة. أعتقد أن هذا بسيط جدًا ولكنه قد يكون مربكًا للمستخدم.
الرسائل (من django.contrib.messages) لن تتحقق من جانب الخادم مثل نموذج التعليقات.
بداية من جانغو Django الإصدار 1.10 يمكنك توليد SECRET_KEY جديد من خلال دالة get_random_secret_key على النحو التالي:
./manage.py shell -c "from django.core.management.utils import get_random_secret_key; print(get_random_secret_key())"
-
إجابة سامح أشرف سؤال في عمل رسالة بريد إلكتروني من خلال قوالب جانغو Django كانت الإجابة المقبولة
بداية من الإصدار 1.7 جانغو Django أصبح بإمكانك إضافة بيانات ديناميكية من خلال المعامل html_message. إذا تم توفير المعامل html_message (قيمته ليست None)، فسيكون بإمكانك أن تستخدم متغيرات في نص البريد الإلكتروني، ولإتمام هذه العملية ستحتاج إلى إستعمال الدالة render_to_string لكي تستطيع عمل النص، وبالتالي يمكنك عمل الرسالة على النحو التالي:
from django.template.loader import render_to_string from django.core.mail import EmailMultiAlternatives username = "My Username" msg_plain = render_to_string('templates/email.txt', {'username': username}) msg_html = render_to_string('templates/email.html', {'username': username}) msg = EmailMultiAlternatives('عنوان الرسالة', msg_plain, 'info@example.com', ['username@gmail.com']) msg.attach_alternative(msg_html, "text/html") msg.send() بهذه الطريقة سوف يتم توليد نص البريد الإلكتروني من خلال المتغيرات التي يمكنك تمريرها إلى الدالة render_to_string، وفي النهاية تقوم بإرسالة هذه الرسالة بشكل عادي.
-
إجابة سامح أشرف سؤال في الحصول على قائمة بحقول نموذج معين في جانغو Django كانت الإجابة المقبولة
يمكن عمل ذلك في جانغو Django ولكن تختلف الطريقة حسب الإصدار الذي لديك، فبالنسبة إلى الإصدار 1.8 وما هو أحدث من جانغو Django، يمكنك أن تستخدم التابع get_fields، على النحو التالي:
# نستدعي النموذج هنا from django.contrib.auth.models import User [field.name for field in User._meta.get_fields()] # أو [field.name for field in User._meta.fields] بهذه الطريقة سوف تحصل على قائمة بكل الحقول الموجودة في هذا النموذج.
لاحظ أن التابع get_fields سوف يقوم بإرجاع على بعض العلاقات التي لا يمكنك عرضها في view على سبيل المثال.
أما بالنسبة للإصدارات الأقدم من 1.8، فيمكنك أن تستخدم التابع get_all_field_names، على النحو التالي:
model._meta.get_all_field_names() لاحظ أن هذه الدالة لا تعمل إلا في الإصدارات القديمة وأصبحت متجاهلة deprecated، وتم حذفها بداية من الإصدار 1.10
-
إجابة سامح أشرف سؤال في التحقق من وجود نتائج من عملية إستعلام في جانغو Django كانت الإجابة المقبولة
الكائن queryset يوفر التابع exists والذي من خلال تستطيع معرفة إن كان هناك نتائج أم لا، حيث يعيد True في حالة وجود نتائج، و False في حالة كان الكائن فارغًا، ويمكنك إستخدامه على النحو التالي:
if users.exists(): # أفعل شيء ما else: # أفعل شيء آخر كما يمكنك التحقق من الـ queryset بشكل مباشر كالتالي:
if users: # أفعل شيء ما else: # أفعل شيء آخر
-
إجابة سامح أشرف سؤال في HTML | متى نستعمل عنصر ما من عناصر semantic element ؟ كانت الإجابة المقبولة
يصف العنصر الدلالي بوضوح معناه لكل من المتصفح والمطور.
أمثلة على العناصر غير الدلالية non-semantic مثل: div و span - لا تحدد محتوياتها بوضوح.
أمثلة على العناصر الدلالية semantic :مثل footer و header و article - تحدد محتوياتها بوضوح (أي أنها تستخدم في حالات معينة).
لكل عنصر من نوع semantic يكون له مكان معين يُستعمل فيه، وفي أغلب الأحيان سوف تحصل على نفس النتيجة إن أستعملت div فقط بدلًا من nav أو header على سبيل المثال، لكن الفرق يظهر عندما تريد أن يظهر موقعك في النتائج الأولى لمحركات البحث، حيث تنصح جوجل (وباقي محركات البحث بالطبع) أن تستخدم كل عنصر في مكانه الصحيح، حتى يصبح الأمر أسهل على محركات البحث من فهم محتوى صفحتك، وبالتالي تساعد في تحسين SEO الخاص بالموقع.
هنا صورة توضح الأماكن الرئيسية لكيفية إستخدام أهم العناصر الدلالية semantic:
header: هو رأس الصفحة ويوجد فيه في الغالب شعار الموقع وأزرار تسجيل الدخول والإشعارات، وقد يحتوي أشياء أخرى مثل زر لفتح قائمة جانبية أو نافذة للبحث .. إلخ. nav: هو المكان الذي يوجد فيه أهم الروابط الرئيسية في الموقع، يمكنك أن ترى شرط التنقل في موقع حسوب في الأعلى وستجد أنه يحتوي على رابط الصفحة الرئيسية وأقسام المقالات وأقسام الأسئلة العامة، والدورات .. إلخ، أي أنه يحتوي على أهم روابط الموقع فقط. aside: يعبر عن الشريط الجانبي، وقد يحتوي على آخر التعليقات، أحدث المقالات أو حتى روابط صفحات التواصل الإجتماعي الخاص بالموقع. footer: يكون في الغالب هو آخر جزء في الموقع، ويحتوي على بعض الصفحات العامة عن الموقع، مثل صفحة "تواصل معنا"، وصفحة "معلومات عنا" وصفحات مختلفة أخرى، وقد يحتوي على روابط التواصل الإجتماعي أيضًا وعلى نموذج للتواصل مع مدير الموقع. main: يحتوي على الجزء الرئيسي من الصفحة، مثل الجزء الذي يظهر فيه التدوينة (في المدونات)، أو نتائج البحث (في محركات البحث)، أو حتى المكان الذي يظهر فيه مقطع الفيديو (إن كان موقع لنشر فيديدوهات)، يجب أن تحتوي الصفحة على عنصر main واحد على الأكثر. article: تكون في الغالب داخل عنصر main وتحتوي على المقالة/التدوينة. section: يستخدم لتقسيم أجزاء الصفحة التي ليس لديها عنصر خاص، على سبيل المثال، يوجد للمقالة عنصر article، ولكن لا يوجد عنصر لعارض شرائح slideshow وبالتي سوف تستخدم هذا العنصر وتضع في داخله عارض الشرائح (بإعتبار أن عارض الشرائح عبارة عن قسم في الصفحة، أي جزء رئيسي منها). address: يستخدم لعرض العناوين بشكل خاص، ومعلومات التواصل بشكل عام time: لعرض التواريخ والأوقات هذه بعض العناصر الدلالية semantic elements والأكثر إستخدامًا. وقد تساعدك هذه المقالة (تعرف على أكثر الأخطاء شيوعا لدى استخدام HTML5) في معرفة بعض الأخطاء التي يقع فيها الكثير من مطوير الويب.
-
إجابة سامح أشرف سؤال في إستخدام id و pk في إستعلامات جانغو Django كانت الإجابة المقبولة
في الحقيقة لا يهم أي منهما تستخدم فسوف تحصل على نفس النتيجة في النهاية. ولكن pk عام أكثر ، لأنك لن تضطر لمعرفة اسم المفتاح الأساسي primary key في الجدول، أي أنك لست بحاجة إلى الاهتمام بما إذا كان حقل المفتاح الأساسي يسمى id أو user_id .. إلخ. كما أنه يوفر مزيدًا من التناسق إذا كان لديك نماذج ذات حقول مفاتيح أساسية مختلفة، حيث سوف تستخدم نفس الصيغة في كتابة الإستعلامات، ولن تضطر لتذكر المفتاح الأساسي لكل نموذج model. لذلك يفضل أن تستخدم pk بدلًا من id في الحالات العامة.
لاحظ أيضًا أن id يعد دالة built-in في بايثون، وقد يكون هذا سبب في ظهور خطأ، إن قمت بخلط أسماء المتغيرات والدوال معًا.
على الجانب الآخر، قد يكون إستخدام id أسرع من إستخدام pk، وذلك لأن جانغو Django يستغرق وقت في معرفة اسم الحقل الرئيسي عندما تستعمل pk، بينما إن إستعملت id فأنت تستعمل اسم الحقل مباشرة، ولن يضطر جانغو Django إلى معرفة اسم الحقل لأنك أخبرته به بالفعل.
-
إجابة سامح أشرف سؤال في مشكلة port is already running عند تشغيل جانغو Django كانت الإجابة المقبولة
في نظام التشغيل Linux يمكنك أن تستخدم الأمر التالي لإغلاق أي عملية process تستعمل المنفذ 8000:
sudo fuser -k 8000/tcp إن كنت تستخدم MacOS فيمكنك أن تستعمل الأمر التالي:
sudo lsof -t -i tcp:8000 | xargs kill -9 لمعرفة العملية التي تستخدم هذا المنفذ يمكنك أن تستخدم الأمر التالي:
netstat -ntlp سيعرض الأمر السابق كل العمليات التي تستعمل الشبكة في الوقت الحالي مع عرض رقم المنفذ port ورقم العملية ProcessID (نحتاج هذا الرقم لإنهاء العملية نفسها)، ولإنهاء أي عملية يمكنك أن تستخدم رقم PID مع الأمر kill، على النحو التالي:
kill -9 1234 مع تغير 1234 إلى رقم العملية.
أو يمكنك تغير المنفذ الإفتراضي الذي يعمل عليه جانغو Django من خلال كتابة رقم المنفذ بعد أمر تشغيل الخادم، على النحو التالي:
python manage.py runserver 8001
-
إجابة سامح أشرف سؤال في استخدام دالة لطباعة سلسلة من الأرقام في بايثون كانت الإجابة المقبولة
يمكنك عمل دالة تحتوب على حلقة for لكي تقوم بطباعة الرقم كالتالي:
def print_numbers(n): for i in range(1, n+1): print(i, end="") # الخاصية end تسمح لنا جعل النصوص متلاصقة print() # نضيف سطر فارغ فقط print_numbers(5) # Output: 12345
يمكنك أن تكتب كود بايثون بشكل عادي في البرنامج، ثم تقوم بتشغيل الملف من خلال سطر الأوامر CMD عبر الأمر التالي:
python fileName.py أو يمكنك تثبيت إضافة python (من هنا)، وعند كتابة كود بايثون سيظهر لك زر أخضر في أعلى اليمين، عند الضغط عليه سوف يتم تشغيل الكود بشكل مباشر.
يوجد أيضًا برنامج PyCharm (يوجد منه نسخة مجانية Community ونسخة مدفوعة Professional)، وهو برنامج مخصص للغة بايثون فقط، ويحتوي على الكثير من الأدوات والإضافات التي تسهل عليك كتابة كود Python ، ولكن لا ينصح به للمبتدئين نظرًا لصعوبة الواجهة الخاصة به مقارنة بـ VC Code.
-
إجابة سامح أشرف سؤال في وضع حد أقصى لعدد نتائج الاستعلام في جانغو Django كانت الإجابة المقبولة
querysets في جانغو Django كسولة lazy. هذا يعني أن الاستعلام سيصل إلى قاعدة البيانات فقط عندما تستخدم النتيجة على وجه التحديد. لذلك حتى تقوم بطباعة نتيجة استعلام ما أو استخدامها بالفعل، يمكنك التصفية بشكل أكبر دون الوصول إلى قاعدة البيانات.
ويمكنك التأكد من ذلك من خلال طباعة جملة SQL التي يتم تنفيذها على النحو التالي:
import logging log = logging.getLogger('django.db.backends') log.setLevel(logging.DEBUG) log.addHandler(logging.StreamHandler()) User.objects.all().order_by('-id')[:10] """ Output: (0.000) SELECT "auth_user"."id", "auth_user"."username", "auth_user"."first_name", "auth_user"."last_name", "auth_user"."email", "auth_user"."password", "auth_user"."is_staff", "auth_user"."is_active", "auth_user"."is_superuser", "auth_user"."last_login", "auth_user"."date_joined" FROM "auth_user" ORDER BY "auth_user"."id" DESC LIMIT 10; args=() """ وكما ترى في الكود السابق، يتم تنفيذ استعلام SQL واحد فقط لجلب آخر 10 عناصر فقط.
لاحظ جملة LIMIT 10 في النهاية، هذا يعني أنه سوف يتم آخر 10 نتائج فقط من قاعدة البيانات.
-
إجابة سامح أشرف سؤال في كيفية عرض الصور داخل محتوى markdown باستعمال المكون Image الخاص ب nextjs كانت الإجابة المقبولة
لعرض مكون next/Image من خلال Markdown سوف تحتاج إلى إنشاء مكون مخصص يحول صور Markdown إلى صور next/Image
إنشاء ملف Markdown.tsx، على النحو التالي:
import Image from 'next/image' import ReactMarkdown from 'react-markdown' const MarkdownComponents: object = { // سوف نكتب باقي الكود هنا } return ( <ReactMarkdown children={your.content.here} components={MarkdownComponents} /> ) بعد ذلك سوف نضع الكود المسؤل عن تحويل الصور إلى مكون Next/Image، كالتالي:
// طريقة كتابة الصورة في كود Markdown: ![AltText {priority}{768x432}](... p: paragraph => { const { node } = paragraph if (node.children[0].tagName === "img") { const image = node.children[0] const alt = image.properties.alt?.replace(/ *\{[^)]*\} */g, "") const isPriority = image.properties.alt?.toLowerCase().includes('{priority}') const metaWidth = image.properties.alt.match(/{([^}]+)x/) const metaHeight = image.properties.alt.match(/x([^}]+)}/) const width = metaWidth ? metaWidth[1] : "768" // عرض الصورة الإفتراضي const height = metaHeight ? metaHeight[1] : "432" // طول الصورة الإفتراضي return ( <Image src={image.properties.src} width={width} height={height} className="postImg" // يمكنك إضافة أصناف إفتراضية من هنا alt={alt} priority={isPriority} /> ) } return <p>{paragraph.children}</p> }, باستخدام الكود أعلاه، يمكننا استخدام تحويل صورة Markdown إلى مكون Next/Image:
![AltText](/image.jpg) يمكنك إضافة طول وعرض وخاصية priority أيضًا، على النحو التالي:
![AltText {priority}{768x432}](/image.jpg) ملاحظة: اعتبارًا من Next.js 11، لم يعد المكون Next/Image يتطلب تحديد الارتفاع والعرض بوضوح للصور المحلية، ولكن لكي يعمل هذا، يجب إستخدام خاصية src الخاصة بالصورة من خلال جملة import، والتي لن تعمل معنا لأننا نقوم بإستيراد صورة معينة، لذلك يتوجب عليك تحديد طول وعرض الصورة.
الكود السابق يستبدل صور Markdown القياسية بمكون Next/Image. ولكن إذا فتحت الـ Console، فستجد أن هناك خطأ. وذلك لأنها يتم تغليف عنصر الصورة img بعنصر p، وهذا HTML غير صحيح (يعمل ولكنه غير صحيح وغير مستحب).
-
إجابة سامح أشرف سؤال في كيفية كتابة تعليقات في قوالب جانغو Django؟ كانت الإجابة المقبولة
يوفر جانغو Django كتابة تعليقات في سطر واحد Single line comment أو تعليقات متعددة الأسطر Multi line comment على النحو التالي:
تعليق في سطر واحد:
{# This is a single line comment #} يمكنك كتابة تعليق متعدد الأسطر من خلال كتابة عنصري comment و endcomment وأي شيء بينهما سيتم تجاهله من قِبل جانغو Django:
{% comment "Optional note" %} <p>هذا النص لن يظهر في المتصفح</p> {% endcomment %} لاحظ أن تحويل أكواد القالب إلى تعليق HTML، على النحو التالي، سوف يؤدي لعمل render لهذا الكود أيضًا لكن نتيجته سوف تظهر في شكل تعليق HTML:
<!-- {% include 'footer.html' %} --> بينما الطريقة الصحيحة للقيام بذلك هي بإضافة علامة # داخل العنصر نفسه، كالتالي:
{#% include 'footer.html' %#}