سامح أشرف
الأعضاء-
المساهمات
2934 -
تاريخ الانضمام
-
تاريخ آخر زيارة
-
عدد الأيام التي تصدر بها
56
نوع المحتوى
ريادة الأعمال
البرمجة
التصميم
DevOps
التسويق والمبيعات
العمل الحر
البرامج والتطبيقات
آخر التحديثات
قصص نجاح
أسئلة وأجوبة
كتب
دورات
كل منشورات العضو سامح أشرف
-
كانت React hooks موجودة منذ فترة، لكن العديد من مطوري React لا يستخدمونها كثيرًا (مقارنة بالأصناف classes). وهناك سببين رئيسيين وراء ذلك. السبب الأول هو أن العديد من مطوري React يشاركون بالفعل في مشروع كبير، الأمر الذي يتطلب جهدًا كبيرًا لإعادة كتابة الكود بأكمله لكي يتناسب مع react hooks. السبب الآخر هو معرفتهم بأصناف React، فيقول بعض مطوري React: "لماذا أتعلم شيء جديد والذي أعرفه بالفعل يعمل بشكل جيد؟". لكن بالرغم من ذلك، إلا أن هناك أسباب تدفعك لتعلم وإستخدام React Hooks: لن تحتاج إلى إعادة كتابة functional component إلى class component عندما يزداد حجم الكود في الدالة. هناك أوقات يبدأ فيها مكون React بـ functional component، والذي يعتمد فقط على props ثم يتطور لاحقًا إلى مكون Class به state. يتطلب التغيير من functional component إلىclass component القليل من إعادة البناء refactoring، اعتمادًا على مدى تعقيد المكون، لكن عندما تستخدم react hooks من البداية، فلن تحتاج إلى إعادة كتابة المكونات لأن لديك كل شيء بالفعل من خلال react hooks. لا داعي للقلق بشأن الكلمة المفتاحية "this" بعد الآن الجملة أدناه من وثائق React الرسمية. أحد أسباب هذا الالتباس هو هذه الكلمة المفتاحية "this". إذا كنت معتادًا على استخدام JavaScript، فأنت تعلم أن this في JavaScript لا تعمل تمامًا كما هو الحال في اللغات الأخرى. عندما يتعلق الأمر بـ React Hooks، فلا داعي للقلق بشأن هذه الكلمة على الإطلاق. هذا جيد للمبتدئين وكذلك للمطورين ذوي الخبرة. سهولة في كتابة وقراءة الكود يعني سرعة في التطوير وعدد أخطاء أقل. لا داعي لإستخدام لربط الدوال method bindings لن تحتاج إلى عمل method binding لكي تستخدم الدوال ، كل ما عليك فعله هو عمل handler، واستخدم بطريقة مباشرة، هذا كل ما في الأمر. وهذا الأمر يعني بالطبع كود أقل وسرعة في كتابة الشيفرة. أسهل في فصل المنطق البرمجي logic عن واجهة المستخدم UI، مما يجعل كليهما أكثر قابلية لإعادة الاستخدام reusable استخدام الخطافات سجعل من السهل الفصل بين المنطق وواجهة المستخدم. لا حاجة إلى HOC أو render props. تقوم الخطافات بذلك ببساطة مع تركيبات أقل تداخلًا وأكثر سهولة لكل من واجهة المستخدم والمنطق. احتفظ بالمنطق البرمجي logic المرتبط في نفس المكان عند إستخدام class component ، لدينا طرق مختلفة لدورة حياة الخطافات lifecycle hooks مثل componentDidMountand و componentDidUpdate وما إلى ذلك. ومع مرور الوقت ، سيكون هناك العديد من المنطق المتضمن في هذه التوابع، وسيكون من الصعب تتبع الكود وكيفية عمليه. تقاسم المنطق المصحوب بالحالة بين المكونات عند إستخدام class component ، يكون من الصعب مشاركة المنطق القائم على الحالة state بين المكونات. ضع في اعتبارك مكونين حيث يتعين على كليهما جلب البيانات وفرزها وعرضها من مصدرين مختلفين للبيانات. على الرغم من أن كلا المكونين لهما نفس الوظيفة ، فمن الصعب مشاركة المنطق لأن هذه المكونات لها مصادر وحالات مختلفة. لكن باستخدام Custom React Hooks ، يمكنك استخراج هذه المنطق ذات الحالة القابلة لإعادة الاستخدام واختبارها بشكل منفصل. في حين أن هناك العديد من الأسباب للإنتقال إلى React Hooks، فقد ذكرت أكثر الأسباب إنتشارًا لكي تنتقل إلى إستخدام React Hooks. إذا نظرت إلى الوثائق الرسمية، فسترى أن هناك العديد من الوظائف المثيرة للاهتمام في React Hooks. يمكنك الإطلاع عليها ومعرفة المزيد عنها من خلال موسوعة حسوب من هنا (الخطافات في React). يمكنك معرفة بعض الفروق التقنية بين الطريقتين في كتابة المكونات من خلال الإجابات على هذا السؤال:
- 2 اجابة
-
- 2
-
في الحقيقة لا يهم أي منهما تستخدم فسوف تحصل على نفس النتيجة في النهاية. ولكن pk عام أكثر ، لأنك لن تضطر لمعرفة اسم المفتاح الأساسي primary key في الجدول، أي أنك لست بحاجة إلى الاهتمام بما إذا كان حقل المفتاح الأساسي يسمى id أو user_id .. إلخ. كما أنه يوفر مزيدًا من التناسق إذا كان لديك نماذج ذات حقول مفاتيح أساسية مختلفة، حيث سوف تستخدم نفس الصيغة في كتابة الإستعلامات، ولن تضطر لتذكر المفتاح الأساسي لكل نموذج model. لذلك يفضل أن تستخدم pk بدلًا من id في الحالات العامة. لاحظ أيضًا أن id يعد دالة built-in في بايثون، وقد يكون هذا سبب في ظهور خطأ، إن قمت بخلط أسماء المتغيرات والدوال معًا. على الجانب الآخر، قد يكون إستخدام id أسرع من إستخدام pk، وذلك لأن جانغو Django يستغرق وقت في معرفة اسم الحقل الرئيسي عندما تستعمل pk، بينما إن إستعملت id فأنت تستعمل اسم الحقل مباشرة، ولن يضطر جانغو Django إلى معرفة اسم الحقل لأنك أخبرته به بالفعل.
- 2 اجابة
-
- 3
-
في نظام التشغيل 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
- 2 اجابة
-
- 1
-
يمكنك عمل دالة تحتوب على حلقة 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.
- 1 جواب
-
- 3
-
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 نتائج فقط من قاعدة البيانات.
- 1 جواب
-
- 1
-
لعرض مكون 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 غير صحيح (يعمل ولكنه غير صحيح وغير مستحب).
- 1 جواب
-
- 1
-
يوفر جانغو 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' %#}
- 2 اجابة
-
- 1
-
يُفضل أن تلجئ لمحامي متخصص في كتابة مثل هذه العقود، لكي تضمن حقك الكامل في كل ما يخص المشروع من البداية، ويوجب، ويجب أن تخبر المحامي بجزئية تلسيم الكود المصدر Source Code كاملًا وغير مشفر وقابل للتعديل ويحتوي على توثيق كامل لكل الخصائص من تعليقات ووثائق documentation .. إلخ، ونفس الأمر بالنسبة إلى كل من تصميم وقواعد البيانات والعلامات التجارية وكل النماذج الإختبارية .. إلخ. ويدرج هذا الجزء في قسم حقوق الملكية في العقد، على الشكل التالي: قد يختلف النص السابق عندما يقوم محامي مختص بكتابة هذا العقد، ولكن سيظل المضمون واحدًا في النهاية.
- 1 جواب
-
- 1
-
يمكنك أن تقوم بذلك من خلال تعديل ملف 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
- 3 اجابة
-
- 1
-
يمكن لبايثون قراءة Byte فقط في كل مرة. لذلك ستحتاج إلى قراءة الملف حرف تلو الآخر (Byte واحد في كل مرة أو قراءة الملف بالكامل مرة واحدة)، ثم استخراج القيمة التي تريدها من تلك bytes، على سبيل المثال: f = open('mytext.txt', 'rb') b = f.read(1) first_bits = "{:08b}".format(int(b.hex(),16)) # '01101000' أو إذا كنت تريد 7 بتات، بدلاً من 8 بتات: f = open('mytext.txt', 'rb') b = f.read(1) first_bits = "{:08b}".format(int(b.hex(),16))[1:] # '1101000'
-
يوفر جانغو Django طريقة للبحث عن النصوص بغض النظر عن حالة الحروف، على النحو التالي: User.objects.filter(role__iexact="admin") ويمكن الحصول على نتيجة مشابة من خلال البحث عن النصوص التي تحتوي على الجزء المطلوب البحث عنه، كالتالي: User.objects.filter(role__icontains="admin") في المثال الأخير سوف يتم تجاهل حالة الأحرف أيضًا وسوف يتم إرجاع كل الكائنات التي تحتوي على كلمة admin في حقل role بغض النظر عن حالة الأحرف (Case-insensitive).
- 2 اجابة
-
- 1
-
بالتأكيد لأنها تعلمك جزء من التفكير المنطقي وكيفية تحقيق الشروط أيضًا، لكن ليس لها إستخدامات عملية في مجالات البرمجة التي ذكرتها. لاحظ أيضًا أنك لست في حاجة لتعلمها من الأساس لأن الشروط ومعاملاتها (مثل and و or .. إلخ) يتم شرحهم في أي دورة لأساسيات البرمجة، لذلك يمكنك أن تبدأ بتعلم البرمجة بشكل مباشر دون المرور على البوابات المنطقية من الأساس.
- 3 اجابة
-
- 1
-
يقوم التابع 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
- 2 اجابة
-
- 1
-
البوابة هي دائرة إلكترونية تحتوي على (مدخل واحد أو عدة مداخل) ومخرج واحد حيث تقوم بعملية منطقية على المدخل وتنتج المخرج المطلوب، تستخدم هذه البوابات في بناء معالجات الأجهزة الاكترونية والحواسيب، ولا تستخدم البوابات المنطقية logic gates بشكل كبير في مجالات البرمجة بشكل عام، لكن يتم إستعمال نفس المبدأ (مثل المعاملات and و or .. إلخ) في البرمجة كثيرًا وفي أماكن متعددة مثل الجمل الشرطية على سبيل المثال.
- 3 اجابة
-
- 2
-
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 فقط.
- 1 جواب
-
- 2
-
لاحظ أن في جميع الطريق السابقة، يتم جلب كل الكائنات التي لديها الخاصية 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.
- 3 اجابة
-
- 3
-
يوفر 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>
- 3 اجابة
-
- 2
-
يوجد عدة طريق للقيام بهذا الأمر في 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 خبيثة لدى زوار الموقع، مما يؤدي إلى سرقة بياناتهم مثل بطاقات الإئتمان والبريد الإلكتروني وكلمات السر أيضًا.
- 3 اجابة
-
- 2
-
لاحظ أنك تستعمل الصيغة scss بدلًا من less في الخاصية test، وسيكون الكود الصحيح، كالتالي: module.exports = { module: { rules: [ { test: /\-theme.less$/i, // لاحظ صيغة الملفات loader: [ // compiles Less to CSS "style-loader", "css-loader", "less-loader", ], }, ], }, };
- 2 اجابة
-
- 2
-
إذا كان الخطأ يظهر عند محاولة تثبيت حزمة 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
- 3 اجابة
-
- 2
-
يمكنك أن تقوم بذلك من خلال 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.
- 2 اجابة
-
- 1
-
يمكنك إستخدام الوحدة 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
- 3 اجابة
-
- 1
-
يبدو أنك لم تقم بتثبيت قواعد بيانات 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
- 2 اجابة
-
- 1
-
يمكنك حل المشكلة من خلال عمل custom template filter، كالتالي: from django.template.defaulttags import register @register.filter def lookup(dict, k): return dict.get(k) أستخدم .get بحيث إذا لم يكن المفتاح موجود في القاموس، فإنه يُرجع None بدلًا من أن يظهر خطأ KeyError بعد ذلك. ويمكنك أن تستخدم الفتلر السابق، على النحو التالي: {% for item in list %} {{ user|lookup:item.NAME }} {% endfor %} وفي حالة كنت تستعمل قوالب Jinja2، فهي تدعم جلب القيم من خلال متغيرات بشكل إفتراضي على النحو التالي: {{ user[item] }} أيضًا إن كنت تقوم بالمرور على القيم من القاموس، فتستطيع أحضار كلاً من المفتاح والقيمة من القاموس في الحلقة، بالشكل التالي: {% for key, value in user.items %} {{ value }} {% endfor %}
- 2 اجابة
-
- 2
-
لنفترض أنك قمت بتعريف هذا العنوان في عناوين 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',)))
- 2 اجابة
-
- 1