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

مسعود زاهي

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

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

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

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

    1

أجوبة بواسطة مسعود زاهي

  1. توجد عدة طرق للقيام بهذا الأمر.

    • الطريقة الأولى: 
    >>> from django.db.models import F
    >>> MyModel.objects.annotate(new_name= F('original_name')).values('new_name')
    [{'new_name': 1}, {'new_name': 2}]
    
    # أنشأنا عمود جديد في الكائن وسميناه بالاسم الجديد
    # بعدها أعطيناه قيمة العمود القديم باستخدام الكائن
    # F
    • الطريقة الثانية:
    # مثل الطريقة الأولى لكن باستعمال
    # extra
    
    >>> MyModel.objects.extra(select={'new_name': 'original_name'}).values('new_name')
    [{'new_name': 1}, {'new_name': 2}]
    • الطريقة الثالثة:
      # كما يمكننا تغيير الاسم مباشرة في 
      # values
      
      >>> from django.db.models import F
      >>> MyModel.objects.values(new_name=F('original_name'))
      [{'new_name': 1}, {'new_name': 2}]

       

    • أعجبني 1
  2. يمكنك استخدام علامة القالب (tamplatetag) divisibleby المدمجة في Django.

    • divisibleby: تقوم بارجاع True عندما تكون القيمة تقبل القسمة على العنصر المُدخل. مثلا:
      {{ value|divisibleby:"3" }}
      # إذا كانت القيمة = 21 فسيكون الإخراج
      # True
      # أما اذا كانت القيمة لا تقبل القسمة على 3 فسيكون الإخراج 
      # False

      إذا مثالك يُصبح:

      {% for p in posts %}
          <!-- ملاحظة: forloop.counter0 => تقوم بالعد من 0 -->
          <!-- forloop.counter0|divisibleby:'4' يكون الاخراج صحيحا عند العنصر الخامس لا الرابع -->
          <!--  لهذا عليك استعمال -->
          <!-- forloop.counter -->
          <div class="post flex flex-row justify-start {% if forloop.counter|divisibleby:'4' %}bg-black{% endif %}}">
      
              <h2>p.title</h2>
              <div class="preview">
                <!-- ... -->
              </div>
            
              <div class="overlay">
                <!-- ... -->
              </div>
            
          </div>
      {% endfor %}

       

    • أعجبني 3
  3. يوجد عدة طرق لطباعة أول عنصر في مجموعة.

    • الطريقة الأولى
    {{products.0}}
    • الطريقة الثانية باستخدام علامة القالب first:
    {{products|first}}
    #أما اذا كنت تريد طباعة خاصية داخل الكائن فيمكنك استعمال
    # with
    {% with products|first=firstPoduct %}
    	#هنا اطبع الخاصية التي تريد مثلا خاصية الاسم
    	{{firstPoduct.name}}
    {% endwith %}
    • الطريقة الثالثة باستخدام الحلقة for:
      {% for product in products %}
         {% if forloop.first %}
         		{{product}}
         {% endif %}
      {% endfor %}

       

    • أعجبني 2
  4. للحصول على عداد الحلقة الخارجية أو الحلقة الأب يمكن استعمال forloop.parentloop.counter كما يلي:

    {% for parent in ParentItems %}
        {% for item in parent %}
            <!-- {{forloop.parentloop.counter}} هو عداد الحلقة الخارجية -->
            <!--  {{ forloop.counter }} هو عداد الحلقة الداخلية -->
            <li>{{ forloop.parentloop.counter }} - {{ item }}</li>
        {% endfor %}
    {% endfor %}

    يمكنك أيضا استعمال with لتخزين عداد الحلقة الخارجية واستعماله لاحقاً:

    {% for parent in ParentItems %}
        {% with pcounter=forloop.counter %}
        	{% for item in parent %}
            	<!-- {{pcounter}} هو عداد الحلقة الخارجية -->
            	<!--  {{ forloop.counter }} هو عداد الحلقة الداخلية -->
            	<li>{{ pcounter }} - {{ item }}</li>
        	{% endfor %}
        {% endwith %}
    {% endfor %}

     

    • أعجبني 1
  5. للحصول على أعلى 5 كُتاب من خلال نموذج Transaction ما عليك إلا استعمال:

    from django.db.models import Count#نقوم باستيراد النموذج Count
    Transaction.objects.values('author')
    			.annotate(total=Count('author'))
      			.order_by('-total')[:5]

    الشرح:

    • نستخدم عادة values لحصر الأعمدة التي يتم إرجاعها في مجموعة النتائج، في مثالنا قمنا فقط باسترجاع العمود author.
    •  لإضافة عمود آخر للكائن الموجود في الQuerySet نقوم باستعمال annotate. في مثالنا قمنا بإضافة Count('author') وسميناه total.
    • بعدها قمنا بترتيب ال QuerySet من الأكبر إلى الأصغر باستخدام order_by('-total').
    • للحصول على أعلى 5 كتاب فقط ماعلينا الا استخدام [:5]. 
    • أعجبني 2
  6. المشكلة هو أنك تقوم باستدعاء الدالة get - التي بدورها تُظهِر الخطأ - قبل أن تصل إلى assertRaises.

    الحل هو أن تقوم بالفصل بين الدالة get  وبين قيمها (arguments) كما هو مبين في المرجع الخاص بال unitests. 

    from django.utils import unittest
    
    def test_user_can_delete_question_response(self):
      # ...
      self._driver.get("http://localhost:5000/questions/3") 
      # هنا تقوم بالفصل بين الدالة وبين قيمها
      self.assertRaises(Answer.DoesNotExist, Answer.objects.get, body__exact = '<p>User can reply to question\'s answers.</p>')

    أو يوجد حل آخر هو استعمال with:

    from django.utils import unittest
    
    def test_user_can_delete_question_response(self):
      # ...
      self._driver.get("http://localhost:5000/questions/3") 
      with self.assertRaises(Answer.DoesNotExist):
        Answer.objects.get(body__exact = '<p>User can reply to question\'s answers.</p>')
     

    لمزيد من المعلومات يرجى زيارة المرجع على الرابط التالي TestCase.assertRaises

    • أعجبني 1
  7. لا شكر على واجب أخي. سؤال مهم متى نستمع هذه الخواص أظن أن الأمر يحتاج إلى أمثلة لتوضيح إستعمالات كل خاصية:

    • ال Set نستعملها عادة لتخزين قيم غير مكررة ذات أنواع مختلفة، بدائية (primitive) كانت أو كائنات (objects)
    var set1 = new Set();
    set1.add('a');  // ==> Set { 'a' }
    set1.add(1);  // ==> Set { 'a', 1 }
    set1.add('1'); // ==> Set { 'a', 1, '1' }
    
    // القيمة 1 أضيفت سابقا
    set1.add(1); // ==> Set { 'a', 1, '1’ }
    
    //يمكننا أيضا تخزين الكائنات
    var obj1 = { prop1: 'Hello!' };
    set1.add(obj1); // ==> Set { 'a', 1, '1', { prop1: 'Hello!' } }
    • ال WeakSet نستعملها عندما نحتاج فقط لتخزين كائنات (objects) غير مكررة ( لا يمكن تخزين قيم بدائية)
    const ws = new WeakSet();
    const foo = {};
    const bar = {};
    
    ws.add(foo);
    ws.add(bar);
    
    ws.has(foo);    // true: موجود
    ws.has(bar);    // true: موجود
    
    ws.delete(foo); // حذف foo
    ws.has(foo);    // false, غير موجود
    ws.has(bar);    // true, موجود
    •  ال Map نستعملها لتخزين ثنائيات ( مفتاح + قيمة).  
    var map1 = new Map();
    
    //القيمة قد تكون أولية مثل 
    //string
    map1.set(1, 'hello'); // ==> Map { 1 => 'hello’ }
    
    // القيمة قد تكون كائن
    map1.set('jimmy', {x: 'y'}) // ==> Map { 1 => 'hello', 'jimmy' => { lastName: 'farrell' } }
    
    
    // وقد تكون مجموعة
    var arr1 = ['a', 'b'];
    map1.set(arr1, [1, 2]); // ==> Map { 1 => 'hello', 'jimmy' => { x: 'y' }, [ 'a', 'b' ] => [ 1, 2 ] }
    • ال WeakMap أيضا نستعملها لتخزين ثنائيات ( مفتاح + قيمة) غير أن المفتاح يجب أن يكون كائنا (Object)
    • أعجبني 2
  8. ال weakSet تسمح لك بتخزين objects في مجموعة،  فهي تشبه ال Set يعني أن ما يوجد في المجموعة يكون فريداً من نوعه غير مكرر.

    الإختلاف الرئيسي بينها وبين ال Set هو أن WeakSet مجموعة من ال objects فقط. يعني انها لا يمكن أن تحتوي على قيمة من نوع بدائي.

     مثال على ذلك:

    const visitedSet = new WeakSet();
    let john = { name: "John" };
    let pete = { name: "Pete" };
    
    visitedSet.add(john); // زارنا ‫John
    visitedSet.add(pete); // وبعده ‫Pete
    
    visitedSet.add("Mary"); // خطأ
                            // ﻷن القيمة هنا من نوع بياني بدائي
                            // الأنواع  البيانية البدائية هي:
                            //String, Number, BigInt, Boolean, Symbol

    أم بالنسبة لل WeakMap فهي مجموعة من الثنائيات كل ثنائية تضم مفتاحاً وقيمة (key و value) فهي تشبه  ال Map لكن الخلاف بينهما يكمن في أن المفتاح (key) يجب أن يكون object لا يمكن أن يكون من أنواع البيانات البدائية.

    مثال على ذلك:

    const wm1 = new WeakMap(),
          wm2 = new WeakMap();
    
    const o1 = {},
          o2 = function() {};
    
    let obj = {};
    
    wm1.set(o1, 37);
    wm1.set(o2, 'azerty');
    wm2.set(o1, o2); //القيمة يمكن أن تكون اي شيء، فيمكن أن تكون
                     // object
                     // أو دالة
    wm2.set(o3, undefined);
    
    wm2.set(wm1, wm2); // ويمكن أن يكون المفتاح والقيمة عبارة عن
                       // WeakMaps
                       // أيضا
    
    w2.set("test", "Whoops");// خطأ المفتاح لا يمكن أن يكون من نوع  بياني بدائي
                             
                             

     

    • أعجبني 1
  9. عادة Flask يبحث عن القوالب ( templates) في مستوى الجذر لتطبيقك  في مجلد يسمى templates. لتغيير هذا المجلد أو إختيار مجلد آخر ما عليك فعله الا استعمال template_folder على الشكل التالي:

    app = Flask(__name__, template_folder='frontend')
    
    @app.route('/notifications')
    def notifications():
        return render_template("view_notifications.html")#هنا عليك فقط وضع اسم القالب

     

    • أعجبني 1
  10. للوصول إلى مبتغاك يمكنك إستعمال كود جافاسكربت لتغيير قيمة <p> في كل مرة.

    غير الكود في ملف index.html إلى ما يلي:

    <p id=counter></p><!-- هنا تضع أي دي للوسم-->
    <!-- بعدها تغير محتواه باستعمال كود جافاسكربت-->
    <script>
        document.getElementById("counter").textContent="{{ i }}";
    </script>

     

    • أعجبني 1
×
×
  • أضف...