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

Mustafa Suleiman

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

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

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

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

    365

كل منشورات العضو Mustafa Suleiman

  1. أرجو التعليق أسفل فيديو الدورة في التعليقات من أجل مساعدتك بشكل أفضل، وطرح الأسئلة العامة التي لا تتعلق بدروس الدورة هنا في قسم أسئلة البرمجة. وبخصوص سؤالك، يتم شرح منفذ الأوامر في البداية لكونه من الأساسيات، وبعد ذلك سيتم التطرق إلى Pycharm لا تقلق.
  2. هل يمكنك تجربة الكود مرة أخرى؟ وما هو الكود الذي تستخدمه؟
  3. يمكنك معرفة ما إذا تم تحميل التطبيق بالفعل من متجر Google Play من خلال إضافة معلمة إضافية إلى الرابط مثل معرف المستخدم أو أي معرف آخر فريد. مثل التالي: https://play.google.com/store/apps/details?id=com.example.myapp&user_id=1234567890
  4. سيتم ترجمة محتوى الحقل "content" أيضًا. والطريقة تتمثل في استخدام نموذج "ModelTranslation" لترجمة النماذج في Django. وفي المثال، يتم ترجمة اسم الحقل "content" فقط ولكن باستطاعتك ترجمة محتوى الحقل أيضًا عن طريق إضافة ترجمة لقيمة الحقل كالتالي: # models.py class MyModel(models.Model): name = models.CharField(max_length=255) content = models.TextField() class Meta: translations = { 'content': { 'en': 'content in English', 'ar': 'محتوى باللغة العربية', }, } والنتيجة هي ترجمة محتوى الحقل "content" إلى "content in English" باللغة الإنجليزية و "محتوى باللغة العربية" باللغة العربية. ولإضافة حقول جديدة إلى نموذجك، ما عليك سوى إضافة حقول جديدة إلى نموذجك وإضافة ترجمات لها إلى الملف "models.py". وهناك طرق أخرى لترجمة المعلومات القادمة من قاعدة البيانات في Django، ولكن تلك الطريقة هي طريقة بسيطة وفعالة.
  5. مشكلة تحذير maximum update depth exceeded تحدث عندما يستدعي المكون setstate أكثر من 100 مرة في دورة حياة واحدة، وذلك عندما يكون المكون مرتبطًا بحدث أو مكون آخر يطلق تغييرات بشكل متكرر. وأنت تحصل على التحذير لأنك تستدعي setstate في كل مرة يتم فيها استدعاء useEffect، وذلك لأنك تربط useEffect بـ moment() و timings، حيث يتم تحديث moment() بشكل متكرر، مما يؤدي إلى استدعاء useEffect بشكل متكرر. وكحل بسيط استخدم useCallback لإنشاء دالة ثابتة من moment() و timings، من أجل تقليل عدد المرات التي يتم فيها استدعاء useEffect. import { useEffect, useState, useCallback } from 'react'; import { Col, Row } from 'react-bootstrap'; import moment from 'moment'; function Test() { const [today, setToday] = useState({}); const memoizedMoment = useCallback(() => moment(), []); // const memoizedTimings = useCallback(() => timings, []); useEffect(() => { const t = memoizedMoment(); setToday({ time: t.format('hh:mm:ss a'), date: t.format('D/MMM/YYYY'), }); }, [memoizedMoment]); return ( <Row> <Col>{today.date}</Col> <Col>{today.time}</Col> </Row> ); } export default Test;
  6. 1- توزيع الحصص في حالة جلب أحد الشركاء المشروع البرمجي: 50% إلى الشريك الذي جلب المشروع البرمجي، وذلك لمساهمته في جذب العميل وتأمين المشروع. 25% إلى كل شريك من الشركاء الآخرين، وذلك لمساهمتهم في إدارة الشركة وتطويرها. وبالطبع يمكن تعديل النسبة حسب مساهمة كل شريك في المشروع، وإن كان الشريك الذي جلب المشروع البرمجي قد ساهم أيضًا في تطويره أو تسويقه، فيمكن زيادة حصته إلى 60% أو 70%. 2- توزيع الحصص في حالة عدم امتلاك أحد الشركاء الخبرة بالعمل البرمجي 50% إلى كل شريك من الشركاء الآخرين، وذلك لمساهمتهم في العمل البرمجي والتطوير. 25% إلى الشريك الذي لا يمتلك الخبرة البرمجية، وذلك لمساهمته في إدارة الشركة وتسويقها. وهناك مساحة لتعديل النسبة حسب مساهمة كل شريك في الشركة، فلو كان الشريك الذي لا يمتلك الخبرة البرمجية قد ساهم أيضًا في إدارة الشركة أو تسويقها، فيمكن زيادة حصته إلى 30% أو 35%. وهناك نقاط هامة وهي: الأخذ بعين الاعتبار مساهمة كل شريك في الشركة، سواء كانت مساهمة مالية أو فنية أو إدارية. ضرورة الاتفاق بين الشركاء على توزيع الحصص بشكل واضح وعادل. مراجعة توزيع الحصص بشكل دوري، وذلك حسب تطور الشركة ومساهمة كل شريك فيها.
  7. أرجو إضافة الكود من خلال علامة <> عند كتابة السؤال من أجل مساعدتك بشكل أفضل. وكمثال على ما تريديه تستطيعي استخدام flexbox كالتالي: كود HTML مع CSS <!DOCTYPE html> <html> <head> <style> .container { display: flex; align-items: center; /* لمحاذاة العناصر عمودياً */ } .container img { width: 100px; /* تعديل حجم الصورة حسب الحاجة */ height: auto; /* للحفاظ على تناسب الصورة */ margin-right: 10px; /* تعديل المسافة بين الصورة والنص */ } </style> </head> <body> <div class="container"> <img src="https://placehold.co/600x400" alt="صورة"> <p>نص هنا</p> </div> </body> </html> https://academy.hsoub.com/programming/css/أمثلة-نموذجية-لاستخدام-flexbox-في-css3-r471/
  8. من خلال الرابط من خلال إضافة معرف فريد إلى الرابط لكل مستخدم سواء كان معرف المستخدم أو أي معرف آخر فريد. أي إنشاء رابط دعوة على النحو التالي: https://example.com/download?user_id=1234567890 هنا نستخدم الرابط معرف المستخدم 1234567890، عندما يقوم المستخدم بالنقر فوق الرابط، سيتم تتبع معرف المستخدم الخاص به في سجل التطبيق. أو بالشكل التالي: http://example.com/download?invite_code=123456 وباستطاعتك استخدام متغيرات PHP لإنشاء رابط دعوة ديناميكي على النحو التالي: $user_id = 1234567890; $link = "https://example.com/download?user_id=$user_id"; وإليك مثال على كيفية تتبع من قام بتحميل التطبيق من خلال الرابط باستخدام PHP: // حدد معرف المستخدم $user_id = $_GET['user_id']; // تحقق مما إذا كان المستخدم موجودًا $user = User::find($user_id); if (!$user) { // المستخدم غير موجود return; } // سجل تحميل التطبيق $app_download = new AppDownload(); $app_download->user_id = $user_id; $app_download->save(); ثم تنفيذ تعقب للمستخدمين الذين قاموا بتنزيل التطبيق من خلال الرابط عن طريق استعلام قاعدة البيانات للمعرفات التي تم تخزينها والتي تمثل المستخدمين الذين استخدموا الرابط، ثن تنفيذ المكافآت أو الإجراءات المناسبة للمستخدمين الذين قاموا بتنزيل التطبيق من خلال الرابط كمنحهم نقاط مكافأة أو دعوتهم للانضمام إلى مجموعة خاصة.
  9. أرجو منك طرح أي أسئلة متعلقة بالدورات أسفل فيديو الدورة. رسالة الخطأ TemplateDoesNotExist تعني أن Django لا يمكنه العثور على ملف القالب templets.html، للأسباب التالية: ملف القالب غير موجود. ملف القالب ليس في دليل تم تكوين Django للبحث عن القوالب فيه. ملف القالب له الاسم الخطأ. وتحتاج إلى التأكد من وجود ملف القالب وأنه في دليل تم تكوين Django للبحث عن القوالب فيه، وتستطيع التحقق من إعداد TEMPLATES في ملف settings.py الخاص بك لمعرفة أي الأدلة تم تكوين Django للبحث عن القوالب فيها. فتحقق للتأكد من وجود ملف القالب templets.html. إذا وجدت ملف القالب، فتأكد من أنه في دليل تم تكوين Django للبحث عن القوالب فيه. إذا كان ملف القالب في الدليل الصحيح، فتحقق للتأكد من أنه يحمل الاسم الصحيح. أيضًا تأكد من أن مجلد القوالب لديك بالاسم الصحيح وهو templates
  10. افتح ملف .htaccess ثم أضف الكود التالي: RewriteEngine on RewriteCond %{ENV:GEOIP_COUNTRY_CODE} !^(GB|US|IN)$ RewriteRule (wp-login|xmlrpc).php$ - [F,L] وعندما يقوم زائر من الدولة المستهدفة بمحاولة الوصول إلى موقعك، سيتم رفض الوصول وستظهر لهم صفحة خطأ 403 Forbidden دون إعادة توجيههم إلى صفحة معينة.
  11. استخدم ملف .htaccess لإرسال إعادة توجيه 301 إلى صفحة فارغة من أجل إعادة توجيه الزوار إلى صفحة فارغة دون عرض صفحة الخطأ التي تم إنشاؤها بواسطة كود المنع. أضف السطر التالي إلى الملف: RewriteEngine On RewriteCond %{ENV:GEOIP_COUNTRY_CODE} ^US$ RewriteRule ^(.*)$ /404.html [L] والكود السابق يفترض أنك ترغب في منع زوار من الولايات المتحدة من دخول موقعك، ورمز البلد للولايات المتحدة في قاعدة بيانات GeoIP هو "US". لذلك، يمكنك استخدام هذا الرمز كـ "كود_الدولة_المستهدفة" في القاعدة. هذا يعني أنه إذا كانت دولة الزائر تابعة للولايات المتحدة (رمز الدولة "US")، سيتم إعادة التوجيه إلى صفحة 404.html بدلاً من عرض الصفحة الرئيسية لموقعك. والكود التالي لمنع أكثر من دولة: RewriteEngine On RewriteCond %{ENV:GEOIP_COUNTRY_CODE} ^US$ [OR] RewriteCond %{ENV:GEOIP_COUNTRY_CODE} ^GB$ RewriteRule ^(.*)$ /404.html [L] لدينا شرطين (RewriteCond)، أحد الشروط يتحقق إذا كان رمز الدولة هو "US" (ولاية متحدة) والآخر يتحقق إذا كان رمز الدولة هو "GB" (المملكة المتحدة)، وإذا تطابق أي من هذين الشرطين (باستخدام [OR])، سيتم إعادة التوجيه إلى صفحة 404.html.
  12. بعد إكمال دورة بايثون، ستكون قد اكتسبت المعرفة والمهارات اللازمة لبدء العمل في مجال البرمجة.، ويمكنك التخصص في أحد المجالات التالية: بعد إكمال دورة بايثون، ستكون قد اكتسبت المعرفة والمهارات اللازمة لبدء العمل في مجال البرمجة. يمكنك التخصص في أحد المجالات التالية: برمجة الويب، وتركز هذا التخصص على تطوير مواقع الويب وتطبيقاتها، وبعد إكمال الدورة، ستكون قادرًا على بناء مواقع ويب أساسية ومتقدمة، وتطبيقات ويب تفاعلية من خلال Django وFlask. الواجهة الخلفية حيث ستكون قادرًا على بناء وصيانة واجهات برمجية API للتفاعل بين مختلف التطبيقات والخدمات عبر الإنترنت، باستخدام إطارات عمل مثل Django أو Flask لبناء منطق الخادم والتفاعل مع قواعد البيانات. مبرمج تطبيقات سطح المكتب (Desktop App Developer) إذا أردت تطوير تطبيقات سطح المكتب لأنظمة مثل Windows أو macOS أو Linux باستخدام إطارات عمل مخصصة مثل PyQt وTkinter وwxPython. مجال الذكاء الاصطناعي، ويهتم ذلك المجال بتطوير أنظمة الذكاء الاصطناعي التي يمكنها تعلم واتخاذ القرارات، وستكون قادرًا على استخدام بايثون لبناء نماذج تعلم آلي وأنظمة ذكاء اصطناعي. مجال علم البيانات وتحليلها في حال كنت مهتمًا بمجال تحليل البيانات وتخزينها وتحويلها، يمكنك تعلم أدوات لمعالجة البيانات مثل Apache Spark وتعلم قواعد البيانات المتقدمة.
  13. عليك أن تسأل السؤال من ناحية أخرى، ما الفائدة من تعلم الرياضيات أثناء تعلم البرمجة؟ ففي مجال مثل تطوير الويب أنت لست بحاجة أبدًا إلى أكثر من أساسيات الرياضيات التي تعلمتها أثناء دراستك في المدرسة، والرياضيات في ذلك المجال هي آخر شيء قد تحتاجه في حياتك. هل نفس الأمر ينطبق على الواجهة الخلفية Back-End؟ ليس تمامًا، فالأمر يتوقف على نوع المشروع الذي تعمل عليه، فمثلاً لو كنت تعمل على مشروع آلة حاسبك متخصصة في معادلات معينة فبالطبع تحتاج إلى الرياضيات هنا، لكن هناك مشاريع كثيرة لن تحتاج بها تعلم الرياضيات. ولكن تتطلب بعض مجالات البرمجة تعلم الرياضيات بشكل أكثر تركيزًا، مثلل مجال الذكاء الاصطناعي حيث تستخدم الرياضيات بشكل أساسي في تطوير تطبيقات الذكاء الاصطناعي، مثل تعلم الآلة والمعالجة اللغوية الطبيعية. أيضًا مجال مثل مجال تطوير الألعاب، ةلإنشاء ألعاب بصرية جذابة، يجب على المطورين فهم الجبر الخطي والهندسة المثلثية والهندسة الرياضية، وتلك المفاهيم تساعد في تصميم وتنفيذ الرسومات والتأثيرات البصرية بشكل دقيق. أيضًا بعض الألعاب تتضمن الذكاء الصناعي (AI) للأعداء أو الشخصيات غير اللاعبة، وتستند العديد من تقنيات الذكاء الصناعي إلى الرياضيات مثل الرياضيات التصورية والاحتمالات، وفي تطوير ألعاب ثلاثية الأبعاد (3D)، تكون الرياضيات ضرورية لمعالجة الأبعاد الثلاثة والتلاعب بالأشكال والأجسام الثلاثية الأبعاد. وعلي أي حال بشكل أساسي عليك تعلم الرياضيات في حال أردت دخول مجال تعلم لآلة وعلم وتحليل البيانات. وكقاعدة تعلم الأمر عندما تحتاجه فمجال البرمجة واسع جدًا وعليك تحديد ما تريده لكي لا تضيع مجهودك.
  14. ما هو Gulp.js Gulp.js هو أداة (Task Runner) يستخدم في تطوير الويب،لتنفيذ مهام مثل تجميع وضغط ملفات CSS وJavaScript، وتحسين الصور، وتشغيل اختبارات الوحدات الأوتوماتيكية، وإدارة أنشطة تطوير الويب الأخرى، ويمكن لـ Gulp أن يعمل بشكل مستمر أو يُطلق يدويًا بمجرد الحاجة.، ويعتمد على JavaScript ويتيح للمطورين كتابة مهام مخصصة باستخدام سينتكس سهل الفهم. وهناك أيضًا أدوات أخرى تُستخدم كـ Task Runners مثل Grunt وnpm scripts في عالم تطوير الويب والبرمجة، وتُسهل تلك الأدوات تنظيم وتنفيذ المهام الروتينية بشكل فعال وآلي، مما يساعد المطورين ومديري النظم على تحسين كفاءة العمل وتوفير الوقت والجهد. ما هو Pug.js أما Pug.js هو محرك قوالب HTML مفتوح المصدر مبني على JavaScript. يسهل عملية إنشاء HTML قصير وسهل القراءة وقابل للصيانة، ويدعم Pug.js العديد من الميزات المتقدمة، مثل الوسائط المتعددة المتكاملة، وإدارة الوسائط، وتعليقات التسمية التوضيحية. وهو ليس مناسبًا لجميع المشاريع، خاصة المشاريع التي تتطلب دعمًا لتقنيات HTML المتقدمة. مثال بسيط على Pug: // ملف Pug html head title Pug Example body h1 This is a Pug example p This is a simple Pug template that outputs an HTML page with a heading and a paragraph. والكود السابق سينتج كود HTML التالي: <html> <head> <title>Pug Example</title> </head> <body> <h1>This is a Pug example</h1> <p>This is a simple Pug template that outputs an HTML page with a heading and a paragraph.</p> </body> </html> وإليك مثال أكثر تعقيدًا على Pug: // ملف Pug html head title Pug Example link(rel='stylesheet', href='style.css') body .container h1 This is a Pug example p This is a more complex Pug template that outputs an HTML page with a heading, a paragraph, and a container element with a class of "container". ul li Item 1 li Item 2 li Item 3 والنتيجة هي: <html> <head> <title>Pug Example</title> <link rel="stylesheet" href="style.css"> </head> <body> <div class="container"> <h1>This is a Pug example</h1> <p>This is a more complex Pug template that outputs an HTML page with a heading, a paragraph, and a container element with a class of "container".</p> <ul> <li>Item 1</li> <li>Item 2</li> <li>Item 3</li> </ul> </div> </body> </html> أهمية Gulp.js و Pug.js في الوقت الحالي لا يزال Gulp.js و Pug.js مهمين في الوقت الحالي، ولكن هناك أدوات حديثة حاليًا وأكثر شيوعًا وتقدمًا والتي منها: Webpack هو الأكثر شيوعًا في الوقت الحالي، ويوفر مجموعة واسعة من الميزات، بما في ذلك تجميع ملفات JavaScript و CSS و HTML وإدارة التبعيات. Parcel سهل الاستخدام يركز على السرعة والسهولة. Vite المحزم الجديد الذي يهدف إلى تسريع عملية تطوير الويب ويستخدم بكثرة الآن وأنا أفضله عن Webpack. ولتفهم الأمر بشكل مفصل أرجو منك قراءة التالي: وGulp.js لم يتم تطويره منذ 2019.
  15. في بايثون، هناك نوعان من الدوال: الدوال العادية، والتي يتم تعريفها باستخدام الكلمة الأساسية def. الدوال المجهولة، والتي يتم تعريفها باستخدام الكلمة الأساسية lambda. الفرق الأساسي بين Lambda و def هو أن Lambda هي دالة مجهولة، أي أنها لا تحتوي على اسم. أي في lambda نقوم ببناء الدالة كالتالي: lambda arguments: expression و عدد العبارات هو عبارة واحدة. أمثلة على الدوال المجهولة: # دالة مجهولة تضيف 1 إلى الرقم المدخل lambda x: x + 1 # دالة مجهولة تتحقق مما إذا كان الرقم الزوجي lambda x: x % 2 == 0 # دالة مجهولة تطبع الرقم المدخل lambda x: print(x) بينما في def نقوم ببناء الدالة كالتالي: def function_name(arguments): body بينما هنا عدد العبارات هو أي عدد من العبارات في جسم الدالة. أمثلة على الدوال العادية: # دالة عادية تضيف 1 إلى الرقم المدخل def add_one(x): return x + 1 # دالة عادية تتحقق مما إذا كان الرقم الزوجي def is_even(x): return x % 2 == 0 # دالة عادية تطبع الرقم المدخل def print_number(x): print(x) متى تستخدم Lambda؟ عندما تحتاج إلى دالة بسيطة يتم استخدامها مرة واحدة فقط. عندما تحتاج إلى دالة يتم استخدامها كتعبير في دالة أخرى، مثل map() أو filter(). عندما تحتاج إلى دالة يتم تمريرها كمعامل إلى دالة أخرى. تعابير lambda في بايثون
  16. سبب المشكلة هو fatal error: stddef.h: No such file or directory والذي يعني أن المُجمِّع لا يستطيع العثور على الملف stddef.h، وذلك الملف هو ملف رأس قياسي لـ C/C++ يحتوي على تعريفات لأنواع أساسية وعلامات، ومن أسباب المشكلة: المُجمِّع غير مثبت بشكل صحيح. المُجمِّع غير مثبت في المسار الذي يستخدمه المُجمِّع. المُجمِّع يستخدم إصدارًا مختلفًا من مكتبة معايير C/C++ عن الإصدار الذي يحتوي على stddef.h. حاول تحديث وترقية MinGW من خلال الأوامر التالية: mingw-get update mingw-get upgrade وإن كنت تستخدم Cygwin، فتأكد من تثبيت الحزمتين gcc-core و gcc-g++. أما إن كنت تستخدم MinGW، فتأكد من تثبيت الحزمة mingw32-base.
  17. حاول تحديث pip من خلال الأمر التالي: python -m pip install --upgrade pip بعد ذلك تثبيت المكتبة من خلال الأمر التالي: pip install easyocr وإذا استمرت المشكلة حاول التالي: pip install --pre torch -f https://download.pytorch.org/whl/nightly/cpu/torch_nightly.html أيضًا حاول تحديث بايثون إلى إصدار 3.11 إذا استمرت المشكلة ثم القيام بالأمر السابق مرة أخرى.
  18. هناك طريقتان لمنع دولة معينة من الدخول إلى موقعك: الطريقة الأولى: استخدام ملف .htaccess افتح ملف .htaccess الموجود في جذر موقعك باستخدام محرر نصوص. أضف السطر التالي إلى الملف: Order Deny,Allow Deny from [قائمة الدول] حيث [قائمة الدول] هي قائمة بعناوين IP لدول معينة، مفصولة بفواصل، وتستطيع الحصول على هذه العناوين من مواقع مثل ip2location أو countryipblocks. ولمنع الوصول من إيران والصين مثلاً عليك إضافة السطر التالي إلى ملف .htaccess: Order Deny,Allow Deny from 1.2.3.4/24 Deny from 5.6.7.8/24 الطريقة الثانية: استخدام خدمة حظر الوصول بإمكانك استخدام خدمة حظر الوصول لمنع دولة معينة من الدخول إلى موقعك حيث هناك العديد من الخدمات المتاحة، مثل Cloudflare و GeoIP2. احصل على حساب في الخدمة التي تختارها. اتبع التعليمات الخاصة بإضافة موقعك إلى الخدمة. حدد الدولة التي تريد منعها من الوصول إلى موقعك. ومشكلة الايبيهات هي أنها قد لا تعمل من مواقع مثل ip2location أو countryipblocks في ملف .htaccess. وذلك لأن هذه المواقع توفر عناوين IP تقريبية فقط، ومن الأفضل الإعتماد على خدمة حظر الوصول التي توفر عناوين IP دقيقة. وعليك تفهم التالي: قبل منع دولة معينة من الدخول إلى موقعك، تأكد من أنك تفهم العواقب المحتملة فسيؤدي يؤدي ذلك إلى فقدان الزيارات من تلك الدولة. تستطيع استخدام خدمة حظر الوصول لمنع الوصول من عناوين IP محددة، بدلاً من دولة معينة.
  19. أفضل طريقة لإضافة حقول إلى نموذج المستخدم هي القيام بذلك في بداية المشروع قبل أي عملية migration، ولكن إن كنت قد بدأت بالفعل في إنشاء عمليات الهجرة، فهناك بعض الطرق التي يمكنك من خلالها إضافة حقول إلى نموذج المستخدم بعد ذلك. الطريقة الأولى: إنشاء نموذج المستخدم واستبدال نموذج المستخدم الافتراضي من Django عن طريق فتح ملف models.py الخاص بتطبيق Django لديك وقم بإنشاء نموذج المستخدم. ولإنشاء نموذج مستخدم جديد يسمى MyUser مع حقل جديد يسمى profile_picture لصورة الملف الشخصي، عليك إضافة السطر التالي إلى ملف models.py: class MyUser(AbstractUser): profile_picture = models.ImageField(upload_to='profile_pictures', blank=True) بعد ذلك، يجب عليك إنشاء هجرة جديدة لتحديث قاعدة البيانات. للقيام بذلك، استخدم الأمر التالي: python manage.py makemigrations ثم قم بتشغيل الهجرة باستخدام الأمر التالي: python manage.py migrate الطريقة الثانية: تعديل نموذج المستخدم الافتراضي من Django وإضافة الحقول الجديدة من خلال فتح ملف models.py وابحث عن نموذج المستخدم الافتراضي AbstractUser. ثم أضف الحقول الجديدة إلى نموذج المستخدم. ولإضافة حقل جديد يسمى profile_picture لصورة الملف الشخصي، تستطيع إضافة السطر التالي إلى نموذج المستخدم: profile_picture = models.ImageField(upload_to='profile_pictures', blank=True) بعد ذلك، يجب عليك إنشاء هجرة جديدة لتحديث قاعدة البيانات. للقيام بذلك، استخدم الأمر التالي: python manage.py makemigrations ثم قم بتشغيل الهجرة باستخدام الأمر التالي: python manage.py migrate الطريقة الثالثة: إنشاء نموذج حقل إضافي وربطه بنموذج المستخدم من خلال التوجه لملف models.py وابحث عن نموذج المستخدم الافتراضي AbstractUser. ثم أضف حقل profile_picture إلى نموذج المستخدم. ولإضافة حقل جديد يسمى profile_picture لصورة الملف الشخصي، نضيف السطر التالي إلى نموذج المستخدم: profile_picture = models.OneToOneField( 'profile.Profile', null=True, blank=True, ) ثم قم بإنشاء نموذج جديد يسمى Profile مع حقل image لصورة الملف الشخصي، ولإنشاء نموذج جديد يسمى Profile مع حقل image لصورة الملف الشخصي، عليك إضافة الكود التالي إلى ملف models.py: class Profile(models.Model): image = models.ImageField(upload_to='profile_pictures', blank=True) class Meta: abstract = True بعد ذلك، يجب عليك إنشاء هجرة جديدة لتحديث قاعدة البيانات ثم قم بتشغيل أمر التهجير.
  20. مكتبة OpenCV تحتوي على مجموعة واسعة من الدوال الخاصة بالصور، والتي يمكن استخدامها لأداء مجموعة متنوعة من المهام، مثل: قراءة الصور وعرضها معالجة الصور تحليل الصور التعرف على الصور وإليك شرح تفصيلي لبعض الدوال الخاصة بالصور في مكتبة OpenCV، مع أمثلة: 1- قراءة الصور وعرضها. تستخدم الدوال التالية لقراءة الصور وعرضها: imread(): تستخدم لقراءة صورة من ملف. imshow(): تستخدم لعرض صورة على شاشة. waitKey(): تستخدم للانتظار حتى يضغط المستخدم على أي مفتاح. import cv2 # قراءة الصورة image = cv2.imread("image.jpg") # عرض الصورة cv2.imshow("Image", image) # الانتظار حتى يضغط المستخدم على أي مفتاح cv2.waitKey(0) 2- معالجة الصور تستخدم الدوال التالية لمعالجة الصور: cvtColor(): تستخدم لتحويل صيغة الصورة. resize(): تستخدم لتغيير حجم الصورة. flip(): تستخدم لقلب الصورة. threshold(): تستخدم لتطبيق حد على الصورة. import cv2 # قراءة الصورة image = cv2.imread("image.jpg") # تحويل الصورة إلى صيغة رمادية gray_image = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY) # عرض الصورة الرمادية cv2.imshow("Gray image", gray_image) # الانتظار حتى يضغط المستخدم على أي مفتاح cv2.waitKey(0) 3- تحليل الصور تستخدم الدوال التالية لتحليل الصور: findContours(): تستخدم للعثور على حدود الأشكال في الصورة. matchTemplate(): تستخدم للبحث عن نمط معين في الصورة. HoughCircles(): تستخدم للعثور على الدوائر في الصورة. import cv2 # قراءة الصورة image = cv2.imread("image.jpg") # العثور على حدود الأشكال contours, hierarchy = cv2.findContours(image, cv2.RETR_TREE, cv2.CHAIN_APPROX_SIMPLE) # عرض حدود الأشكال for contour in contours: cv2.drawContours(image, contour, -1, (0, 255, 0), 2) # عرض الصورة مع حدود الأشكال cv2.imshow("Image with contours", image) # الانتظار حتى يضغط المستخدم على أي مفتاح cv2.waitKey(0) 4- التعرف على الصور تستخدم الدوال التالية للتعرف على الصور: haarcascade_frontalface_default(): تستخدم للتعرف على الوجوه. haarcascade_eye_tree_eyeglasses(): تستخدم للتعرف على العيون. svm_frontalface_alt(): تستخدم للتعرف على الوجوه باستخدام التعلم الآلي. import cv2 # تحميل مصفوفة هارس لتعرف الوجوه face_cascade = cv2.CascadeClassifier("haarcascade_frontalface_default.xml") # قراءة الصورة image = cv2.imread("image.jpg") # العثور على الوجوه في الصورة faces = face_cascade.detectMultiScale(image, 1.3, 5) # رسم إطارات حول الوجوه for (x, y, w, h) in faces: cv2.rectangle(image, (x, y), (x + w, y + h), (255, 0, 0), 2) # عرض الصورة مع الوجوه cv2.imshow("Image with faces", image) # الانتظار حتى يضغط المستخدم على أي مفتاح cv2.waitKey(0) المستند الرسمي: https://docs.opencv.org/4.x/db/deb/tutorial_display_image.html
  21. حاولي تثبيت مكتبتي libpq-dev و python-dev من خلال الأمر التالي أو إضافتها إلى ملف requirements.txt: sudo apt install python3-dev libpq-dev
  22. لا أستطيع معرفة السبب على وجه التحديد دون تفقد الحاسوب، لذلك من الأفضل والأسهل للجميع استخدام خدمة سحابية مثل Google drive أو onedrive لمزامنة ومشاركة الملفات وهي الخيار الأفضل في حال توفر إنترنت. أو حاول إعادة تثبيت نسخة الويندوز للحسوب الذي يوجد به مشكلة، ولكن قبل ذلك، حاول مشاركة ملف آخر وتفقد هل المشكلة مستمرة أيضًا؟
  23. مشكلة انتهاء الصلاحية في نموذج Carts.js لديك هي أنك تستخدم قيمة ثابتة لـ expires، والتي هي 10، مما يعني أن العنصر سينتهي صلاحيته بعد 10 ثوانٍ. عليك استخدام قيمة زمنية لـ expires، مثل: expires: new Date(Date.now() + 1000 * 60 * 60 * 24) // 24 ساعة استخدام قيمة زمنية للمؤشر index، مثل: index: { expireAfterSeconds: 3600 // 1 ساعة } أو استخدام قيمة زمنية للمؤشر index، مثل: index: { expireAfterSeconds: 3600 // 1 ساعة } أما بالنسبة لمشكلة التداخل، فهذا يحدث لأنك تقوم بإنشاء عنصر جديد في كل مرة تقوم فيها بإضافة منتج إلى السلة. وحل هذه المشكلة عن طريق تحديث العنصر الموجود بدلاً من إنشاء عنصر جديد بتغيير الكود في index.js كما يلي: if (cart) { var indexOfProduct = -1; for (var i = 0; i < cart.selectedProduct.length; i++) { if (product_id === cart.selectedProduct[i]._id) { indexOfProduct = i; break; } } if (indexOfProduct >= 0) { // console.log(cart.selectedProduct[indexOfProduct]); cart.selectedProduct[indexOfProduct].quantity++; cart.selectedProduct[indexOfProduct].price += newproductPrice; cart.selectedProduct[indexOfProduct].price = Math.round(cart.selectedProduct[indexOfProduct].price * 100) / 100; cart.totalquantity++; cart.totalPrice += newproductPrice; cart.totalPrice = Math.round(cart.totalPrice * 100) / 100; cart.createAt = Date.now(); Carts.updateOne({ _id: cartId }, { $set: cart }) .catch((err) => { console.log(err) }) .then((result) => { console.log('update:', result); console.log('cart-update: ', cart); }) } else { cart.totalquantity++; cart.totalPrice += newproductPrice; cart.totalPrice = Math.round(cart.totalPrice * 100) / 100; cart.selectedProduct.push(newProduct); cart.createAt = Date.now(); Carts.updateOne({ _id: cartId }, { $set: cart }) .catch((err) => { console.log(err) }) .then((result) => { console.log('add:', result); console.log('cart-add: ', cart); }) } } من أجل تحديث العنصر الموجود في حالة وجوده، أو إنشاء عنصر جديد إذا لم يكن موجودًا.
  24. هل قمتي بإتباع الطريقة الأولى واستخدام مكتبة psycopg2-binary==2.8.5؟
  25. السبب هو أنك كتبت console بشكل غير صحيح عليك تصحيحها لتصبح console وليس comsole وإذا كان السؤال متعلق بأحد الدورات، أرجو منك التعليق أسفل فيديو الدورة لمساعدتك بشكل أفضل.
×
×
  • أضف...