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

سامح أشرف

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

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

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

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

    56

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

  1. إجابة سامح أشرف سؤال في مصادر و خطة تعلم ال UI/UX Desinger ؟ كانت الإجابة المقبولة   
    UI هي واجهة المستخدم (User Interface)، بينما UX هي تجربة الإستخدام (User Experience)، ولكل منهما العديد من التفاصيل والشروحات والأداوات التي يمكنك إستخدامها، ومصمم واجهة الاستخدام UI/UX Designer لا يقوم بكتابة الأكواد ولكن كتابة الأكواد هي عمل UI/UX Developer، فالمصمم هو من يقوم بعمل مخطط للتصميم ثم يقوم المختص بتحويلها الى كود فعلي.
    في الوقت الحالي لن تجد الكثير من المحتوى العربي الذي يتخصص في تصميم واجهة الاستخدام UI/UX Design (على الأقل مقارنة بالمحتوى الأجنبي)، يمكنك أن تحصل على دورة مقدمة من Google بخصوص تجربة الإستخدام User Experience وهي دورة مجانية لفترة تجريبية (للحصول على الشهادة يجب أن تقوم بدفع مبلغ مالي) تقوم بدراستها من خلال موقع Coursera، تقدم الدورة شرح للأساسيات مثل wireframing و prototyping مع أسخدام أدوات مثل Adobe X.D و Figma.
    كما أن أكاديمية حسوب تحتوي على العشرات من المقالات في التصميم بشكل عام وفي تصميم واجهة الاستخدام UI/UX Design بشكل خاص، وأنصحك بأن تبدأ بسلسلة مقدمة إلى UI لتعلم كل ما يخص واجهة المستخدم User Interface، بالإضافة إلى سلسلة مدخل إلى تجربة المستخدم لتعلم تجربة الإستخدام User Experience، وكلٌ من السلسلتين يُعد مدخل ممتاز يحتوي على شرح لكل ما ستحتاج تعلمه للبدأ في العمل في هذا المجال.
    ستتعلم من خلال دورة جوجل ومن خلال السلستين السابقتين العديد من المصطلحات مثل:
    User Interviewing - مقابلة المستخدمين Usability Testing - اختبار قابلية الاستخدام Human Computer Interaction - تفاعل الإنسان والحاسوب Strategy Design - تصميم الإستراتيجية وغيرها الكثير. أيضًا سوف تحتاج إلى التدرب على أشهر أدوات التصميم مثل Adobe X.D و Figma فالطبع لن تستطيع عمل تصميم ممتاز حتى وإن كانت لديك معرفة كبيرة بالمجال ما لم يكن لديك معرفة بالأدوات التي سوف تستعملها.
    عند إنتهائك من تعلم الدروس والأدوات السابقة أنصحك بالإطلاع على المقالات العامة في قسم التصميم لأنك سوف تحصل على معرفة ممتازة بأدوات وأشياء وقواعد لم تكن تعلمها من قبل مما سيؤدي بالنهاية إلى جعل تصاميمك أكثر إحترافية.
    بعد تعلم ما سبق سوف تجد أن الأمور أصبحت أكثر وضوحًا وستعرف تلقائيًا الخطوة التالية.
  2. إجابة سامح أشرف سؤال في استفسار عن اهمية قاعدة البيانات في لغة php كانت الإجابة المقبولة   
    بالتأكيد قواعد البيانات مهمة للغاية ولا يوجد تطبيق ويب كامل إلا وستجد أنه يستعمل أحد أنواع قواعد البيانات مثل MySQL أو PostgreSQL أو SQLite .. إلخ، وسوف تتأكد من هذا الأمر عندما تقوم ببناء مشاريع كاملة مثل عمل مدونة أو متجر إلكتروني أو حتى سكريبت إختصار روابط.
    قواعد البيانات بكل بساطة عبارة عن مجموعة من الجداول يتم فيها تخزين وترتيب البيانات بطريقة معينة في هذه الجداول بحيث يتم جلب وتخزين وتعديل وحذف هذه البيانات من خلال إستخدام لغة SQL.
    في كثير من الأحيان يجب تخزين بعض البيانات في مكان دائم، حيث أن تخزين هذه البيانات في متغيرات سوف يؤدي إلى حذفها بمجرد إغلاق التطبيق أو إنتهاء الطلب request .. إلخ، لذلك سوف تحتاج إلى الإحتفاظ بهذه البيانات في مكان دائم، وقد تتسأل لماذا لا أستعمل الملفات كوسيلة للتخزين فقط، حيث تقوم بالكاتابة في ملف معين، حيث يمكن عمل ملف لتخزين بيانات المقالات أو المستخدمين أو المنتجات إلخ في ملف معين، ولكن عندما تقوم بهذا الأمر سوف تواجة مشاكل في الأداء حيث لجلب تفاصيل مقالة معينة أو مستخدم معين من ملف كهذا سيتوجد عليك قراءة الملف كاملًا (أو سطر وراء سطر على الأقل)، وهذا الأمر لن يكون عمليًا على الإطلاق وسيكون بطيئًا وسيجعل من عملية ربط البيانات بين بعضها البعض أمرًا صعبًا للغاية. والحل هو إستخدام أي نوع من قواعد البيانات مثل MySQL أو PostgreSQL أو SQLite .. إلخ.
    لإيضاح الأمر أكثر حاول أن تقوم بعمل مشروع كامل، وهنا بعض الأمثلة:
    إنشاء مدونة صغيرة عمل متجر إلكتروني تقليد موقع مثل يوتيوب محاولة بناء شبكة إجتماعية بسيطة للغاية بناء لوحة تحكم لأي مشروع صغير عند محاولة تنفيذ أي مثال من الأمثلة السابقة سوف تجد أنه لا مفر من إستخدام قواعد البيانات، وسوف يتحتم عليك تعلمها، لأنه لا يوجد موقع تقريبًا إلا ويستعمل أحد قواعد البيانات، حتى سؤالك هذا (والتعليق الذي تقرأه الآن) يتم تخزينه في قاعدة بيانات ليتم جلبه عند الحاجة (عند عرض هذه الصفحة مثلًا).
    أيضًا أعتقد أنك تقوم بمقارنة كلمة المرور في سكريبت PHP فطريقة مشابهة للتالي:
    if ($user_password == '123456789') { // الدخول إلى الموقع } else { echo "كلمة السر غير صحيحة"; } وهذا الأمر ربما يعمل في الوقت الحالي ولكن له عيوب ومخاطر أمنية (حتى وإن قمت بتشفير كلمة المرور من خلال خوارزميات مثل MD5 أو SHA256) ولن يكون مفيدًا إن كان هناك أكثر من مستخدم بأكثر من حساب وكلمة مرور يستخدمون الموقع.
    ويمكنك تعلم أساسيات قواعد البيانات من خلال هذه المقالة، وهي مدخل ممتاز لفهم ماهيه قواعد البيانات وكيف تعمل:
    كما يمكنك تعلم لغة SQL (اللغة المستخدمة في التعامل مع قواعد البيانات) من خلال موسوعة حسوب (SQL - موسوعة حسوب).
    وإن أخترت قواعد بيانات PostgreSQL فيما بعد فأنصحك بالإطلاع على هذا الكتاب (الدليل العملي إلى قواعد بيانات PostgreSQL 1.0.0) والذي سيرشدك في تعلم الأساسيات بالإضافة إلى أمور متقدمة أكثر عن هذا النوع من قواعد البيانات.
  3. إجابة سامح أشرف سؤال في إزالة صفحة من ذاكرة التخزين المؤقت في جانغو Django كانت الإجابة المقبولة   
    يمكنك أن بإنشاء دالة invalidate_cache ويتم إستخدامها عندما يقوم شخص ما بتحديث منشور في المدونة، وتقوم هذه الدالة بإنشاء المفتاح المستخدم في ذاكرة التخزين المؤقت وإستخدام هذا المفتاح في حذف الذاكرة المؤقتة.
    from django.core.cache import cache from django.http import HttpRequest from django.utils.cache import get_cache_key def invalidate_cache(path=''): request = HttpRequest() request.META = {'SERVER_NAME':'localhost','SERVER_PORT':8000} request.LANGUAGE_CODE = 'en-us' request.path = path try: cache_key = get_cache_key(request) if cache_key : if cache.has_key(cache_key): cache.delete(cache_key) return (True, 'تم حذف الذاكرة بنجاح') else: return (False, 'المفتاح المستخدم غير موجود في ذاكرة التخزين المؤقت') else: raise ValueError('فشل في إنشاء مفتاح ذاكرة التخزين المؤقت') except (ValueError, Exception) as error: return (False, error) ويمكنك إستخدام هذه الدالة على النحو التالي في المكان الذي ترغب به:
     
    status, message = invalidate_cache(path='/path/to/blog/route/')  
  4. إجابة سامح أشرف سؤال في كيفية إستخدام request.user في نموذج serializers في جانغو Django؟ كانت الإجابة المقبولة   
    لا يمكنك الوصول إلى مستخدم الطلب مباشرة. تحتاج إلى الوصول إلى كائن الطلب ، ثم إحضار سمة المستخدم.
    user = self.context['request'].user والطريقة الأكثر أمانًا (لا يظهر خطأ KeyError أو خطأ AttributeError) كالتالي:
    user = None request = self.context.get("request") if request and hasattr(request, "user"): user = request.user كما يوفر Django-Rest-Framework طريقة أسهل للوصول إلى المستخدم الحالي من خلال إستخدام التابع CurrentUserDefault كالتالي:
    from rest_framework.fields import CurrentUserDefault class PostSerializer(serializers.ModelSerializer): class Meta: model = Post def save(self): user = CurrentUserDefault() # الحصول على المستخدم الحالي  
  5. إجابة سامح أشرف سؤال في حذف البيانات المؤقتة في جانغو Django كانت الإجابة المقبولة   
    هذا لأن المفتاح الفعلي للبيانات المؤقتة ليس "posts"، بل هو مفتاح يتم إنشاؤه ديناميكيًا بواسطة جانغو Django باستخدام كلمة posts مع خوارزمية md5، لذلك يوفر جانغو Django التابع make_template_fragment_key لكي تقوم بحذف البيانات المؤقتة.
    يقبل التابع make_template_fragment_key مدخلين، الأول هو اسم fragment_name  هو المفتاح المعطى كاسم لهذه البيانات، وفي هذه الحالة يكون posts، بينما المعامل الثاني هو vary_on وهو قائمة بكل المعطيات التي يتم تمريرها إلى الوسم tag، ولحذف البيانات المؤقتة تقوم بعمل التالي:
    from django.core.cache import cache from django.core.cache.utils import make_template_fragment_key # cache key for {% cache 5000 posts %} key = make_template_fragment_key('posts') cache.delete(key) وإن كان لديك معطيات للوسم، فيمكنك تمريرها على النحو التالي:
    # cache key for {% cache 5000 posts data %} key = make_template_fragment_key('posts', [data])  
  6. إجابة سامح أشرف سؤال في تقييد القيم المسموح بها في نموذج Model في جانغو Django كانت الإجابة المقبولة   
    يوفر جانغو المعامل validators في الحقل IntegerField حيث يقبل هذا المعامل قائمة من المتحققات (دوال مبنية في جانغو Django يمكنها التحقق من قيمة الحقل قبل تخزينها)، وبالتالي يمكنك إضافة شروط على كل حقل مثل تحديد أقصى قيمة يمكن تخزينها وأدنى قيمة أيضًا، ويمكنك عمل ذلك على النحو التالي:
    from django.db.models import IntegerField, Model from django.core.validators import MaxValueValidator, MinValueValidator class UserModel(Model): age = IntegerField( default=18, validators=[ MaxValueValidator(100), MinValueValidator(18) ] ) بعد عمل التعديل السابق على الحقل، يجب أن يتم إستدعاء التابع full_clean من النموذج حتى يتمكن جانغو Django من التعرف على هذه التغيرات، مع العلم أن هذا الإستدعاء غير ضروري للنماذج من نوع ModelForm.
    يوجد أيضًا طريقة أخرى وهي عمل حقل مخصص وتقوم بعد ذلك بكتابة أكواد التحقق validating بنفسك، كما في المثال التالي:
    from django.db import models class IntegerRangedField(models.IntegerField): def __init__(self, verbose_name=None, name=None, min_value=None, max_value=None, **kwargs): self.min, self.max = min_value, max_value models.IntegerField.__init__(self, verbose_name, name, **kwargs) def formfield(self, **kwargs): defaults = {'min': self.min, 'max':self.max} defaults.update(kwargs) return super(IntegerRangeField, self).formfield(**defaults) لاحظ أن الحقل IntegerRangedField الذي قمنا بعمله يقوم بالوراثة من الحقل IntegerField، بعد ذلك يمكنك أن تستخدم هذا الحقل المخصص على النحو التالي:
    from django.db.models import Model class UserModel(Model): age = IntegerRangedField(min_value=18, max_value=100) بالطبع يجب أن تقوم بإستدعاء الصنف IntegerRangedField من المكان الذي أنشأته فيه.
  7. إجابة سامح أشرف سؤال في عمل حقل ForeignKey لنفس النموذج في جانغو Django كانت الإجابة المقبولة   
    يمكن القيام بهذا الأمر في جانغو Django بأكثر من طريقة:
    يمكنك تمرير اسم النموذج كنص إلى ForeignKey وسوف يعمل كل شيء على ما يرام.
    class PostModel(models.Model): parent = models.ForeignKey("PostModel") أو يمكنك استخدام طريقة أكثر ديناميكية من خلال تمرير النص "self" فقط، على النحو التالي:
    class PostModel(models.Model): parent = models.ForeignKey("self") وتسمى العلاقة في هذه الحالة recursive relationship.
    كما يمكنك تحديد ما الذي سيحدث عن حذف الكائن الأجنبي من خلال تحديد الخاصية on_delete كما في المثال التالي:
    class PostModel(models.Model): parent = models.ForeignKey("self"), on_delete=models.CASCADE)  
  8. إجابة سامح أشرف سؤال في دورة React أو Angular كانت الإجابة المقبولة   
    كل من  Angular و React عبارة عن مكتبة في لغة JavaScript ويستخدم كل منهما في إنشاء واجهة المستخدم من خلال عمل تطبيقات SPA.
    تحتوي الأكاديمية على دورة تطوير التطبيقات باستخدام لغة JavaScript وهي الدورة الوحيدة التي يتم خلالها شرح React.js
    هذه الدورة هي دورة عامة يتم خلالها شرح الأساسيات البرمجية بإستخدام لغة JavaScript، ثم شرح تطوير تطبيقات الخادم Backend باستخدام بيئة Node.js وإطار العمل Express.js، ثم تنتقل لأساسيات مكتبة React.js وبناء تطبيق ملاحظات باستخدامها من نوع SPA، ثم ستتعرف على أساسيات مكتبة React Native و Expo لعمل تطبيقات الهاتف الجوال، وستبدأ في تطوير تطبيق جوال للوصل بين الأطباء والمرضى، وبناء بناء تطبيق محادثة يشبه تطبيق WhatsApp، بعد ذلك ستدرس أساسيات إنشاء تطبيقات لسطح المكتب من خلال إطار العمل Electron.js وكيفية إنشاء مشاريع من خلال إطار العمل Next.js، يمكنك معرفة المزيد من التفاصيل من خلال صفحة الدورة من هنا (دورة تطوير التطبيقات باستخدام لغة JavaScript).
    ولا تحتوي الأكاديمية على دورات بخصوص Angular.js ولكن توجد مقالات مجانية تشرح أساسيات Angular.js، ويمكن قراءة هذه المقالات من هنا (مقالات Angular.js)، ونفس الأمر بالنسبة لـ React.js حيث يوجد عدد أكبر من المقالات يمكن قراءتها من هنا (مقالات React.js)
  9. إجابة سامح أشرف سؤال في تغيير اسم النموذج من "Post" إلى "Posts" في لوحة التحكم Admin في جانغو Django؟ كانت الإجابة المقبولة   
    يمكنك أن تستعمل فئة Meta داخل نموذجك وسيفي ذلك بالغرض:
    class Post(models.Model): class Meta: verbose_name_plural = "posts" لاحظ أننا نستخدم الأحرف الصغيرة هنا، حيث أن جانغو Django ذكي بما يكفي لكي يستعمل أحرف كبيرة عندما يحتاج إلى ذلك، لذلك لا تقلق بشأن حالة الأحرف هنا.
    أيضًا لتعديل النموذج في لوحة التحكم فقط، يمكنك أن تقوم بتعديل الملف apps.py، كالتالي:
    class PostConfig(AppConfig): name = "Post" verbose_name = "Posts"  
  10. إجابة سامح أشرف سؤال في تنفيذ أمر manage.py من داخل الكود في جانغو Django كانت الإجابة المقبولة   
    أفضل طريقة لاختبار مثل هذه الأشياء هي استخراج الوظائف المطلوبة من الأمر نفسه إلى دالة function أو فئة class قائمة بذاتها. يساعد ذلك على التجريد من تنفيذ الأوامر يدويًا وكتابة الاختبار دون متطلبات إضافية.
    ويمكنك إستدعاء أي أمر من داخل الكود الخاص بك باستخدام التابع call_command كالتالي:
    from django.core.management import call_command call_command('flush', verbosity=0) call_command('my_command', 'foo') call_command('loaddata', 'test_data', verbosity=0) يستخدم التابع call_command لاستدعاء أمر إدارة management command من داخل الكود، ويقبل مدخل name وهو الأمر الذي تريد تنفيذه، بالإضافة إلى args وهي المعاملات التي يجب إستخدامها مع هذا الأمر الذي تريد تنفيذه، بالإضافة إلى بعض الخيارات options التي تتحكم في طريقة تنفيذ الأمر مثل verbosity.
    يمكنك أيضًا تخزين نتيجة تنفيذ هذا الأمر من خلال كتابة النتيجة في ملف على النحو التالي:
    from django.core.management import call_command with open('/path/to/command_output', 'w') as f: call_command('dumpdata', stdout=f) حيث يقبل التابع call_command معامل باسم stdout و stderr ومن خلالهما يمكن تخزين أي نتائج أو أخطاء في ملفات.
  11. إجابة سامح أشرف سؤال في الحصول على سجل عشوائي في جانغو Django كانت الإجابة المقبولة   
    يوفر جانغو Django طريقة سهلة للحصول على سجل عشوائي بسطر واحد فقط، كالتالي:
    Post.objects.order_by('?').first() لكن هذه الطريقة تستهلك الكثير من موارد الخادم وتسبب بطئ في التشغيل، لذلك يمكنك أن تستخدم طريقة أخرى وهي إستخدام التابع choice من الحزمة random، كالتالي:
    random.choice(Post.objects.all()) هذه الطريقة جيدة في قواعد البيانات الصغير (التي تحتوي على أقل من 100,000 من الصفوف في الجدول).
    أيضًا يمكنك أن تقوم بعمل نفس الأمر لكن من خلال حساب عدد الكائنات في قاعدة البيانات، على النحو التالي:
     
    from random import randint count = Post.objects.all().count() random_index = randint(0, count - 1) random_post = Post.objects.all()[random_index]  
  12. إجابة سامح أشرف سؤال في ما هي الدورات اللازمة لكي أكون مطور Full-Stack؟ كانت الإجابة المقبولة   
    تطوير المواقع بشكل عام ينقسم إلى جزئين: واجهة المستخدم Frontend والواجهة الخلفية Backend وتحتوي الأكاديمية على دورات لتعلم كلا الجزئين من الصفر، وهذه الدورات كالتالي:
    دورة تطوير واجهات المستخدم Frontend: تحتوي هذه الدورة على كل الأساسيات اللازمة للبدء في عمل واجهات المستخدم بأحدث التقنيات، وتبدأ الدورة من شرح أساسيات اللغات المستخدم في تطوير واجهات المستخدم مثل HTML و CSS و JavaScript مع شرح لأشهر المكتبات مثل Bootstrap و jQuery ثم تنتقل لعمل أكثر من مشروع مثل بناء واجهة لموقع يشبه YouTube، وتطوير واجهة استخدام حقيقة لمتجر الكتروني كامل من الصفر، وتطوير موقع لشركة مع مدونة خاصة خطوة بخطوة، وبناء 5 صفحات هبوط مختلفة، وبناء لوحة تحكم لتطبيق ويب، كما ستتعلم كيفية التعامل مع تقنيات أخرى مثل SCSS و Gulp و Git و GitHub وكيفية نشر المشاريع على الإنترنت وغيرها من التقنيات. يمكنك معرفة المزيد من التفاصيل من خلال صفحة الدورة من هنا (دورة تطوير واجهات المستخدم). أما بالنسبة لتطوير الواجهات الخلفية Backend فيوجد ثلاث دورات مختلفة بإستخدام ثلاث لغات، ويمكنك الإشتراك في واحدة منهم فقط لتعلم تطوير الواجهات الخلفية backend، وهم كالتالي: دورة تطوير تطبيقات الويب باستخدام لغة PHP: تستخدم في هذه الدورة لغة PHP وتبدأ الدورة في شرح الأساسيات البرمجية بإستخدام PHP ثم تنتقل لشرح كيفية التخاطب مع الخادم وكيف يتم إرسال الطلبات، ثم يتم عمل تطبيق ويب لإدارة المهام، وشرح أساسيات إطار العمل Laravel، بناء تطبيق إدارة المهام باستخدام إطار العمل Laravel، تطوير واجهة برمجية API بالإعتماد علي نمط RESTful، تطوير موقع إعلانات مبوبة، شبكة اجتماعية تشبه Instagram، تطوير نظام إدارة محتوى CMS كامل من الصفر، وفي النهاية يتم شرح كيفية تطوير قوالب WordPress، يمكنك معرفة المزيد من التفاصيل من خلال صفحة الدورة من هنا (دورة تطوير تطبيقات الويب باستخدام لغة PHP). دورة تطوير التطبيقات باستخدام لغة JavaScript: وهي دورة عامة يتم خلالها شرح الأساسيات البرمجية بإستخدام JavaScript، ثم شرح تطوير تطبيقات الخادم Backend باستخدام بيئة Node.js وإطار العمل Express.js، ثم تنتقل لأساسيات مكتبة React.js وبناء تطبيق ملاحظات باستخدامها من نوع SPA، ثم ستتعرف على أساسيات مكتبة React Native و Expo لعمل تطبيقات الهاتف الجوال، وستبدأ في تطوير تطبيق جوال للوصل بين الأطباء والمرضى، وبناء بناء تطبيق محادثة يشبه تطبيق WhatsApp، بعد ذلك ستدرس أساسيات إنشاء تطبيقات لسطح المكتب من خلال إطار العمل Electron.js وكيفية إنشاء مشاريع من خلال إطار العمل Next.js، يمكنك معرفة المزيد من التفاصيل من خلال صفحة الدورة من هنا (دورة تطوير التطبيقات باستخدام لغة JavaScript). دورة تطوير تطبيقات الويب باستخدام لغة Ruby: تبدأ الدورة في شرح الأساسيات البرمجية بإستخدام Ruby، ستبدأ في عمل مشاريع من خلال  بناء لعبة بسيطة باستخدام لغة Ruby، ثم ستنتقل لإنشاء تطبيقات الويب من خلال التعرف على أساسيات إطار العمل Ruby on Rails، وفي النهاية سوف تقوم بالتطبيق من خلال بناء تطبيق إدارة محتوى، وتطوير شبكة إجتماعية تشبه تويتر، يمكنك معرفة المزيد من التفاصيل من خلال صفحة الدورة من هنا (دورة تطوير تطبيقات الويب باستخدام لغة Ruby).
    لكي تكون مبرمج Full-Stack يجب أن تدرس دورة تطوير الواجهات Frontend وتختار أحد دورات تطوير الواجهات الخلفية Backend.
  13. إجابة سامح أشرف سؤال في خطأ No changes detected أثناء ترحيل البيانات في جانغو Django كانت الإجابة المقبولة   
    لإنشاء عمليات ترحيل أولية لأحد التطبيقات بما في ذلك المجلد migrations، قم بتشغيل الأمر "makemigrations" وحدد اسم التطبيق. سيتم إنشاء مجلد migrations بشكل تلقائي.
    ./manage.py makemigrations <myapp> كما يجب تضمين تطبيقك في INSTALLED_APPS أولاً داخل الملف settings.py وإلا سوف يؤدي إلى ظهور خطأ بعدم وجود التطبيق من الأساس.
    تحتاج إلى تحديد اسم التطبيق إذا كان التطبيق لا يحتوي على مجلد migrations. وقد يحدث هذا إذا قمت بإنشاء التطبيق يدويًا، أو قمت بالترقية من إصدار قديم من جانغو Django لا يحتوي على أي ملفات تهجير migrations.
    إيضًا إذا لم تكن تستخدم الملف models.py وتستخدم مجلد models مخصص للنماذج فيجب أن تقوم بإنشاء الملف init، فعلى سبيل المثال، إن كنت تستخدم الملف my_model.py في المجلد models، فيجب أن تقوم بإنشاء الملف التالي:
    my_app/models/__init__.py أيضًا يجب أن تستدعي في داخله الملف my_model.py، على النحو التالي:
    from .my_model import MyModel  
  14. إجابة سامح أشرف سؤال في جافاسكريبت | لماذا خاصية classList لا تعمل إذا وضعت كود جافا سكريبت في HTML ؟ كانت الإجابة المقبولة   
    لاحظ أن لديك خطأ في كتابة كود JavaScript في عملية تحديد العنصر من خلال الصنف open، حيث أن الكود يجب أن يكون كالتالي:
    <script> let ahref = document.querySelectorAll('.open'); console.log(ahref[1].classList) </script> لاحظ إستخدام التابع querySelectorAll وليس quer أيضًا يجب إضافة نقطة . قبل كلمة open حيث أننا نقوم بتحديد العناصر من خلال الصنف class ولذلك يجب إضافة . قبل اسم الصنف.
    ملاحظة: يتم إضافة العلامة # قبل المعرف في حالة إستخدام المعرفات IDs بدلًا من الأصناف.
    أيضًا كما وضح وائل أن كود جافاسكريبت يتم تنفيذه قبل تحميل عناصر HTML، لذا حتى في حالة كان كود جافاسكريبت يعمل بشكل سليم، فلن يتم إيجاد العنصر .open وذلك لأنه لم يتم تحميله بعد (في وقت تنفيذ كود جافاسكريبت)، ولحل هذه المشكلة يجب نقل الكود إلى أسفل المستند (قبل نهاية جسم الصفحة body)، على النحو التالي:
    <html> <head> <meta charset="UTF-8" /> <title>Learn JavaScript</title> </head> <body> <a class="open" href="https://google.com">Google</a> <a class="open" href="https://wikipedia.org">wikipedia</a> <a class="not" href="https://facebook.com">Facebook</a> <a class="linked" href="https://wikipedia.org">wikipedia</a> <script> let ahref = document.querySelectorAll('.open'); console.log(ahref[1].classList) </script> </body> </html> أو يمكنك أن تستخدم الحدث onload ليتم تنفيذ الكود عندما يكتمل تحميل الصفحة فقط، كالتالي:
    <html> <head> <meta charset="UTF-8" /> <title>Learn JavaScript</title> <script> document.onload = function(e){ let ahref = document.querySelectorAll('.open'); console.log(ahref[1].classList) } </script> </head> <body> <a class="open" href="https://google.com">Google</a> <a class="open" href="https://wikipedia.org">wikipedia</a> <a class="not" href="https://facebook.com">Facebook</a> <a class="linked" href="https://wikipedia.org">wikipedia</a> </body> </html> ويمكنك أن تستعين بهذه المقالة لفهم المزيد عن الأحداث وكيف تعمل (فهم الأحداث في جافاسكربت - أكاديمية حسوب)
     
  15. إجابة سامح أشرف سؤال في خطأ No module named settings بعد تغير اسم مشروع جانغو Django كانت الإجابة المقبولة   
    يمكنك أن تتبع الخطوات التالية لتغيير اسم التطبيق في مشروع جانغو Django:
    أعد تسمية المجلد الموجود في جذر مشروعك (مجلد المشروع الرئيسي)
    غيّر أي مراجع لتطبيقك وكل تبعياتها dependencies، على سبيل المثال، الملفات views.py و urls.py و management.py و settings.py
    قم بتعديل جدول قاعدة البيانات django_content_type باستخدام الأمر التالي:
    UPDATE django_content_type SET app_label='<NewAppName>' WHERE app_label='<OldAppName>'  
    إذا كانت لديك نماذج، فسيتعين عليك إعادة تسمية جداول النماذج. بالنسبة إلى postgreSQL و mysql، استخدم الأمر التالي:
    ALTER TABLE <oldAppName>_modelName RENAME TO <newAppName>_modelName  
    إن كنت تستخدم الإصدار 1.7 أو أعلى من جانغو Django، فيجب أن تقوم بتحديث جدول django_migrations لتجنب إعادة تشغيل عمليات الترحيل السابقة:
    UPDATE django_migrations SET app='<NewAppName>' WHERE app='<OldAppName>'  
    إذا كانت Meta Class الموجود في الملف models.py يحتوي على app_name، فتأكد من إعادة تسمية ذلك أيضًا.
    إذا قمت بوضع مجلدات ثابتة static أو قوالب templates داخل تطبيقك، فستحتاج أيضًا إلى إعادة تسميتها. على سبيل المثال، أعد تسمية OldAppName /static/OldAppName إلى NewAppName/static/NewAppName.
    لإعادة تسمية نماذج جانغو Django، ستحتاج إلى تغيير django_content_type.name في قاعدة البيانات. بالنسبة لـ postgreSQL و mysql، استخدم الأمر التالي:
    UPDATE django_content_type SET name='<newModelName>' where name='<oldModelName>' AND app_label='<OldAppName>'  
    يجب إزالة المجلد __pycache __ الموجود داخل التطبيق، وإلا ستحصل على خطأ من نوع EOFError:
    EOFError: marshal data too short when trying to run the server  
    بعد ذلك يمكنك إعادة تشغيل المشروع بدون مشكلة وستجد أن اسم المشروع قد تغير في كل الإماكن.
  16. إجابة سامح أشرف سؤال في كيفية إرسال بريد إلكتروني من خلال جانغو Django؟ كانت الإجابة المقبولة   
    لأرسل رسائل البريد الإلكتروني تحتاج إلى خادم SMTP حقيقي. إذا لم ترغب في تثبيت خادم SMTP خاص بك، فيمكنك العثور على الشركات التي توفر خادم SMTP بمقابل مادي أو تستخدم بديل مجاني مثل Google نفسها. أستخدام Gmail كخادم SMTP لـ Django أسهل بكثير من التعامل أي خادم آخر. ولعمل ذلك تحتاج إلى تعديل إعدادات المشروع.
    في ملف settings.py:
    EMAIL_USE_TLS = True EMAIL_HOST = 'smtp.gmail.com' EMAIL_PORT = 587 EMAIL_HOST_USER = 'me@gmail.com' EMAIL_HOST_PASSWORD = 'password' قم بإضافة البريد الإكتروني الخاص بك وإستخدم كلمة سر مؤقتة من خلال ما يسمى بـ less secure apps في جوجل (لا تستخدم كلمة المرور الخاصة بك في أي مكان ظاهر مثل ملف settings.py أو غيره من الملفات لأنك لا تعلم من سيمكنه قراءة هذا الملف في المستقبل).
    ملاحظة: بداية من 2016 لم تعد جوجل تقبل إستخدام كلمة المرور بالشكل السابق، بدلًا من ذلك أصبحت جوجل توفر ما يسمى بالتطبيقات الأقل أمانًا من خلال الذهاب Security > Account permissions > Access for less secure apps، حيث سوف تقوم بالحصول على كلمة سر مخصصة لإستخدامها في هذا التطبيق/المشروع بالتحديد ولا يمكن إستخدام كلمة السر هذه للدخول إلى حسابك بالكامل، بل فقط تستخدم لإرسال رسائل البريد الإلكتروني (أو حسب إعدادات التطبيق في جوجل).
    من الأفضل أيضًا أن تضع البريد الإلكتروني وكلمة المرور في متغيرات بيئة environment variable وإستخدام هذه المتغيرات في ملف settings.py
    بعد إتمام الإعدادات السابقة سيمكنك أن ترسل الرسائل من خلال الكود التالي:
    from django.core.mail import EmailMessage emails = ['another@email.com'] email = EmailMessage('Subject', 'Body', to=emails) email.send()  
  17. إجابة سامح أشرف سؤال في تخزين token في قاعدة البيانات في جانغو Django كانت الإجابة المقبولة   
    يمكن استخدام JWT للمصادقة بدون قاعدة بيانات أو ما يسمى بـ database-less authentication. لأنه يشفر البيانات اللازمة للمصادقة في رموز tokens. حيث سيكون تطبيقك قادرًا على مصادقة المستخدمين بعد فك الرموز tokens بالبيانات المضمنة فيه.
    ولكن إذا كنت تريد تخزين رموز tokens في simplejwt ، فيمكنك استخدام نموذج OutstandingingToken لتخزين الرموز في قاعدة البيانات. لكن قبل استخدام OutstandingToken، تأكد من وضع rest_framework_simplejwt.token_blacklist في قائمة INSTALLED_APPS في ملف settings.py.، كالتالي:
    # Django project settings.py # ... INSTALLED_APPS = ( # ... 'rest_framework_simplejwt.token_blacklist', # ... ) ثم تشغيل الأمر التالي لتعديل قاعدة البيانات:
    python manage.py migrate عندما يتم اكتشاف تطبيق token_blacklist في قائمة التطبيقات المثبتة INSTALLED_APPS ، فسيضيف Simple JWT أي رموز refresh token أو access token تم إنشاؤها إلى قائمة من الرموز outstanding tokens.
  18. إجابة سامح أشرف سؤال في تعديل الرد response من simpleJWT في جانغو Django كانت الإجابة المقبولة   
    يمكنك كتابة طريقة العرض الخاصة بك للـ API إذا كنت تريد تخصيصه، ولا تحتاج إلى استخدام العرض الموجود مسبقًا
    from rest_framework_simplejwt.tokens import RefreshToken def get_tokens_for_user(user): refresh = RefreshToken.for_user(user) return { 'refresh': str(refresh), 'access': str(refresh.access_token), } ستعيد الدالة get_tokens_for_user أعلاه serialized لرمز refresh token وaccess token للمستخدم المحدد (المدخل إلى الدالة). بشكل عام، يمكن إنشاء token لأي فئة فرعية subclass من rest_framework_simplejwt.tokens.Token بهذه الطريقة.
     
  19. إجابة سامح أشرف سؤال في البحث في نموذج من خلال حقل DateTime في جانغو Django كانت الإجابة المقبولة   
    يمكنك أن تستخدم الخاصية contains على النحو التالي:
    User.objects.filter(datetime_registred__contains=datetime.date(2021,9,12)) أو يمكنك تحديد السنة والشهر واليوم يدويًا، وبالتالي سيتم تحديد كل المستخدمين الذين سجلوا في الموقع في هذا اليوم فقط بغض النظر عن وقت التسجيل:
    User.objects.filter(datetime_published__year='2021', datetime_published__month='09', datetime_published__day='12') وإن كنت تستخدم الإصدار 1.9 أو احدث من جانغو Django فيمكنك أن تستخدم الخاصية date، كالتالي:
    User.objects.filter(datetime_registred__date=datetime.date(2021, 9, 12))  
  20. إجابة سامح أشرف سؤال في كيفية الحصول على أسماء وقيم الحقول من نموذج model في جانغو Django؟ كانت الإجابة المقبولة   
    يوفر جانغو Django طريقة للحصول على أسماء الحقول وقيمها أيضًا من خلال التابع get_fields والذي يقوم بإرجاع tuple من أسماء الحقول، ويمكنك إستخدامه كالتالي:
    from django.contrib.auth.models import User fields = User._meta.get_fields() for field in fields: print(field.name) وإن كنت تريد المرور على كل الكائنات في نموذج معين فيمكنك أن تستخدم serializers، على النحو التالي:
    from django.core import serializers users = serializers.serialize("python", User.objects.all()) ثم في القالب:
    {% for user in users %} {% for field, value in user.fields.items %} {{ field }}: {{ value }} {% endfor %} {% endfor %} وإن أردت عرض حقول معينة، فيمكنك إضافة الخاصية fields، كالتالي:
    from django.core import serializers users = serializers.serialize("python", User.objects.all(), fields=('name','email'))  
  21. إجابة سامح أشرف سؤال في كيفية الحصول على اسم النطاق domain الخاص بالموقع في قالب جانغو Django؟ كانت الإجابة المقبولة   
    يأتي جانغو Django مع إطار عمل "sites" اختياري. وهي عبارة عن وسيلة ربط الكائنات والوظائف بمواقع ويب معينة، ويمكن من خلاله أن تقوم بإستخراج نطاق الموقع Domain كالتالي:
    from django.contrib.sites.models import Site site = Site.objects.get_current() site.domain كما يوفر جانغو Django طرق أخرى لكي يتم إحضارت نطاق الموقع، مثل التابع get_host في الكائن HttpRequest والذي يقوم بإستخراج النطاق من رأس الطلب request headers، وبالتحديد من الترويسة HTTP_X_FORWARDED_HOST  (يجب أن يكون USE_X_FORWARDED_HOST مفعلًا True في ملف الإعدادات settings.py) أو من خلال HTTP_HOST (على الترتيب).
    ملاحظة: يمكن إستخدام الترويسة HTTP_HOST بشكل مباشر من خلال الكائن request كما في الكود التالي:
    request.META['HTTP_HOST'] لكن لا يجب الإعتماد على هذه الطريقة لأنها تعتمد في الأساس على الطلب الذي يرسله العميل، والذي يمكنه التلاعب به بعدة طرق، وبالتالي يستطيع تغير قيمة الترويسة HTTP_HOST بأي شيء يريده.
    أما إن كان نطاق الموقع ثابت وتريد إستخدامه في أكثر من مكان فيمكنك أن تقوم بتخزينه في ملف settings.py وتستدعيه في أي مكان كما ترغب، على النحو التالي:
    # settings.py SITE_URL = 'http://example.com' ثم يمكنك إستعمال هذا المتغير كالتالي:
    from django.conf import settings def site(request): return {'SITE_URL': settings.SITE_URL} طريقة أخيرة يوفرها جانغو Django وهي إستخدام التابع build_absolute_uri والذي يعيد عنوان URI بالكامل (متضمنًا على نطاق الموقع):
    domain = request.build_absolute_uri('/')[:-1] # https://example.com  
  22. إجابة سامح أشرف سؤال في تعديل كائنات متعددة من نموذج model في جانغو Django كانت الإجابة المقبولة   
    بداية من الإصدار 2.2 من جانغو Django أصبح بإمكانك تعديل مجموعة من الكائنات دفة واحدة من خلال التابع bulk_update، كالتالي:
    >>> objs = [ ... Entry.objects.create(name='old name 1'), ... Entry.objects.create(name='old name 2'), ... ] >>> objs[0].name = 'new name 1' >>> objs[1].name = 'new name 2' >>> Entry.objects.bulk_update(objs, ['name']) تقوم هذه الطريقة بتحديث الحقول المحددة بكفاءة في كائنات النموذج المتوفرة، بشكل عام باستخدام استعلام واحد فقط.
    أما بالنسبة للإصدارات الأقدم (تعمل الطريقة مع كل إصدارات جانغو Django) فيمكنك أن تقوم بعمل التالي:
    Entry.objects.filter(name='old name').update(name="new name") يعيد الكود السابق عدد الكائنات التي تم تحديثها في قاعدة البيانات كرقم صحيح Integer
    ملاحظة: إن كان لديك كود في التابع save فلن يتم تنفيذه، حيث أن التابع save لا يتم إستدعائه من البداية.
  23. إجابة سامح أشرف سؤال في كيفية معرفة أن الكائن model يتم إنشائه Create وليس تحديثه Update في جانغو Django؟ كانت الإجابة المقبولة   
    يمكنك أن تقوم بالتأكد من أن الكائن يتم إنشائه وليس تحديثه في قاعدة البيانات بأكثر من طريقة:
    الطريقة الأولى هي إستخدام self.pk على النحو التالي: self.pk is None: الشرط السابق يتم تنفيذه فقط في حالة كان الكائن يتم إنشائه في قاعدة البيانات لأول مرة، أي أنها عملية insert وليست Update.
    ملاحظة يجب أن يتم إضافة السطر السابق قبل إستدعاء التابع save من الصنف الأب super، أي قبل super(...).save
    يوفر جانغو Django خاصية فريدة لمعرفة نوع العملية، هل هي عملية حفظ كائن جديد Create أو عملية تحديث كائن موجود مسبقًا، وذلك من خلال الخاصية _state.adding: self._state.adding is True إن تحقق الشرط فهي عملية insert وإن لم يتحقق فهي عملية تحديث Update
  24. إجابة سامح أشرف سؤال في تشغيل إختبار test واحد فقط في جانغو Django كانت الإجابة المقبولة   
    منذ الإصدار 1.6 من جانغو Django يمكنك تشغيل حالة اختبار كاملة، أو اختبار فردي. سيتم اكتشاف الاختبارات تلقائيًا الموجودة في أي ملف يبدأ بكلمة test ضمن المسار الحالي Current Working Directory (CWD). لذلك إذا كنت في نفس المجلد الذي يحتوي على الملف manager.py وتريد تشغيل test_a داخل الصنف الفرعي A داخل الملف test.py ضمن التطبيقapp / الوحدة module باسم example، فيجب أن تنفذ الأمر التالي:
    ./manage.py test example.tests.A.test_a ويمكننا أن نضع صيغة الأمر كالتالي:
    ./manage.py test app_name.tests.SubClass.test_name كما يمكنك أن تستخدم الحزمة django-nose التي تتيح لك تحديد الاختبارات لتشغيلها على النحو التالي:
    ./manage.py test another.test:TestCase.test_method أو كما هو مذكور في التعليقات ، استخدم بناء الجملة:
    ./manage.py test another.test.TestCase.test_method لاحظ أن الأمر الأخير لا يحتوي على علامة نقتطين : عكس الأمر الذي يسبقه.
    لتثبيت حزمة django-nose يمكنك تنفيذ أحد الأمر التاليين:
    pip install django-nose pip install -e git://github.com/jazzband/django-nose.git#egg=django-nose ثم يجب إضافة الحزمة ضمن التطبيقات المثبته installed apps في ملف settings.py، كالتالي:
    INSTALLED_APPS = ( # ... 'django_nose', # ... ) وفي النهاية يجب إضافة TEST_RUNNER إلى نفس الملف لكي تتمكن الحزمة من تشغيل الإختبارات:
    TEST_RUNNER = 'django_nose.NoseTestSuiteRunner'  
  25. إجابة سامح أشرف سؤال في جانغو Django يرفض كل طلبات Ajax كانت الإجابة المقبولة   
    يحدث هذا الأمر لأنك لا ترسل رمز CSRF Token مع الطلب، وبالتالي لا يتعرف جانغو Django على مُرسل الطلب، وهذا الأمر لحماية الموقع من بعض الهجمات الإحتيالية التي قد تؤدي إلى إرسال طلبات عشوائية من مواقع مختلفة على أساس أنها مستخدمين، أو حتى سرقة بيانات المستخدمين وكلمات المرور والبطاقات البنكية .. إلخ.
    ولحل المشكلة كل ما عليك فعله هو إرسال رمز CSRF من خلال الخاصية csrfmiddlewaretoken في بيانات الطلب data، على النحو التالي:
    $.ajax({ data: { somedata: 'somedata', csrfmiddlewaretoken: '{{ csrf_token }}' }, إن لم يكن كود JavaScript يتم توليد في ملف عرض view (أي إن كنت تستخدم CDN أو حتى تخزن ملفات JS منفصلة)، فيمكنك أن تقوم بإضافة رمز CSRF إلى الصفحة في شكل حقل مخفي أو حتى كود JavaScript منفصل، ومن خلال JavaScript يتم إحضار هذا الرمز وإدراجه في الطلب، كالتالي:
    <!-- حقل إدخال مخفي --> <input type='hidden' name='csrfmiddlewaretoken' value='{{ csrf_token }}' /> <!-- أو من خلال كود جافاسكريبت منفصل --> <script type="text/javascript"> window.CSRF_TOKEN = "{{ csrf_token }}"; </script> بعد ذلك من خلال جافاسكريبت تستطيع إحضار هذه القيمة وإستخدامها في الطلب.
×
×
  • أضف...