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

مسعود زاهي

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

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

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

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

    1

كل منشورات العضو مسعود زاهي

  1. عادة يحدث هذا الاستثناء لما نُحاول فك حزمة (a tuple) ، لكن الحزمة تحتوي على عدد كبير من القيم أكبر من المتغيرات التي نريد فك الحزمة فيها. مثال على ذلك: def mehtod(): return ("a","b","c") #الدالة تقوم بارجاع حُزمة فيها ثلاث قيم a,b,c = mehtod()#نقوم بفك الحزمة في ثلاث متغيرات # هنا لا يحصل خطأ print a >> "a" print b >> "b" print c >> "c" # أما هنا يحصل خطأ a,b = mehtod() # لأننا قمنا بفك الحزممة في عدد متغيرات أقل من حجم الحزمة الآن ، لا أعرف سبب حدوث ذلك في حالتك ، ولكن ربما ستوجهك هذه الإجابة في الاتجاه الصحيح ان شاء الله.
  2. سبب المشكلة: هو أن جانغو يقوم بفحص قيمة Host في رأس طلب الHTTP المُرسلة ويُقارنها بالقيم الموجودة داخل ALLOWED_HOSTS المُتواجدة في ملف الإعدادات settings.py. إذا كانت قيمة HOST - سواءًا عُنوان أيْبي أو إسم نطاق- مُتواجدة في ALLOWED_HOSTS يقوم جانغو بسماح الطلب. أما في حالة عدم تواجدها فيقوم برفضها مثل ما حصل معك. ملاحظة: هذه هي عبارة عن حماية يوفرها جانغو ليمنع هجمات "HTTP HOST Header"، والتي تكون ممكنة حتى في ظل العديد من تكوينات خادم الويب التي تبدو آمنة. حل المشكلة: يكون بإضافة xxx.xxx.xx.xx الى ALLOWED_HOSTS الموجودة في ملف settings.py. ALLOWED_HOSTS = ['xxx.xxx.xx.xx']
  3. الأمر بسيط أولا قم بجلب الكائن my_interest باستعمال الدالة get مثلاً: my_interest = Interest.objects.get(id=my_interest_id) #قمت بجلب الكائن باستعمال معرفه #يمكنك جلبه بأي خاصية من خصائصه بعدها احذف الرابطة بينه وبين my_user: my_user.interests.remove(my_interest) # ملاحظة: #remove #تقوم بالفصل بين الكائنين ولا تقوم بحذف أي منهما
  4. توجد عدة طرق للقيام بهذا الأمر. الطريقة الأولى: >>> 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}]
  5. يمكنك استخدام علامة القالب (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 %}
  6. يوجد عدة طرق لطباعة أول عنصر في مجموعة. الطريقة الأولى {{products.0}} الطريقة الثانية باستخدام علامة القالب first: {{products|first}} #أما اذا كنت تريد طباعة خاصية داخل الكائن فيمكنك استعمال # with {% with products|first=firstPoduct %} #هنا اطبع الخاصية التي تريد مثلا خاصية الاسم {{firstPoduct.name}} {% endwith %} الطريقة الثالثة باستخدام الحلقة for: {% for product in products %} {% if forloop.first %} {{product}} {% endif %} {% endfor %}
  7. للحصول على عداد الحلقة الخارجية أو الحلقة الأب يمكن استعمال 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 %}
  8. للحصول على أعلى 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].
  9. المشكلة هو أنك تقوم باستدعاء الدالة 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
  10. لا شكر على واجب أخي. سؤال مهم متى نستمع هذه الخواص أظن أن الأمر يحتاج إلى أمثلة لتوضيح إستعمالات كل خاصية: ال 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)
  11. ال 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");// خطأ المفتاح لا يمكن أن يكون من نوع بياني بدائي
  12. عادة Flask يبحث عن القوالب ( templates) في مستوى الجذر لتطبيقك في مجلد يسمى templates. لتغيير هذا المجلد أو إختيار مجلد آخر ما عليك فعله الا استعمال template_folder على الشكل التالي: app = Flask(__name__, template_folder='frontend') @app.route('/notifications') def notifications(): return render_template("view_notifications.html")#هنا عليك فقط وضع اسم القالب
  13. للوصول إلى مبتغاك يمكنك إستعمال كود جافاسكربت لتغيير قيمة <p> في كل مرة. غير الكود في ملف index.html إلى ما يلي: <p id=counter></p><!-- هنا تضع أي دي للوسم--> <!-- بعدها تغير محتواه باستعمال كود جافاسكربت--> <script> document.getElementById("counter").textContent="{{ i }}"; </script>
×
×
  • أضف...