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

Muhammad Nasser2

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

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

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

كل منشورات العضو Muhammad Nasser2

  1. بالطبع، هناك العديد من الأدوات التي يمكن استخدامها لاكتشاف ثغرات حقن SQL في مواقع الويب بخلاف SQLmap. من بين هذه الأدوات: Netsparker: يقوم بفحص الويب واكتشاف الثغرات بما في ذلك حقن SQL. Acunetix: أداة متقدمة تحتوي على ميزات لاكتشاف ثغرات الحقن. Burp Suite: عبارة عن أداة اختبار الاختراق متعددة الاستخدامات، يمكن استخدامها للكشف عن ثغرات حقن SQL. OWASP ZAP (Zed Attack Proxy): أداة اختبار الأمان مفتوحة المصدر تتيح اكتشاف ثغرات حقن SQL وغيرها. هذه الأدوات تقدم واجهات مستخدم سهلة الاستخدام وتقنيات تحليل متقدمة لاكتشاف ثغرات حقن SQL وغيرها من ثغرات الأمان في تطبيقات الويب. تذكر دائمًا استخدام هذه الأدوات بشكل قانوني وفي سياق اختبار الأمان والاختراق المصرح به فقط.
  2. هذا الخطأ يعني أن هناك أخطاء في بناء البرنامج الخاص بك. قد يكون هناك أخطاء في الكود اللذي تم كتابته. يمكنك التحقق من الرسائل التي تظهر في نافذة الـ "Output" أو الـ "Error List" في برنامج التطوير الخاص بك (مثل Visual Studio أو Code::Blocks أو غيره) لمعرفة التفاصيل الكاملة للأخطاء. يفضل تصحيح الأخطاء التي تظهر قبل محاولة تشغيل البرنامج، حيث قد لا يعمل البرنامج بشكل صحيح إذا كان يحتوي على أخطاء في الكود نفسه. إذا كنت بحاجة إلى مساعدة في تحديد الأخطاء أو تصحيحها، يمكنك مشاركة جزء من الشفرة التي تسبب المشكلة وسأحاول مساعدتك في حلها.
  3. يمكنك دمج نتائج استعلامات الايداع والسحب في قائمة واحدة وترتيبها حسب الوقت باستخدام ال union و order_by. ثم يمكنك استخدام القائمة الناتجة في عرض الجدول HTML. يمكنك تعديل view الخاص بك على النحو التالي: from django.db.models import F, Value, CharField from django.db.models.functions import Concat def account_statement(request, id): try: customer = Account.objects.get(id=id) # Get Customer ID customerID = customer.customer.id except Account.DoesNotExist: messages.error(request, 'Something Went Wrong') return redirect('create-customer') else: # Get Customer Deposit by ID and order by Date minimum 5 records displayed deposits = Deposit.objects.filter(customer__id=customerID).annotate( transaction_type=Value('deposit', output_field=CharField()), account=F('acct'), phone=F('customer__phone'), amount=F('deposit_amount'), date=F('date'), staff_username=F('staff__username'), ).order_by('-date')[:5] # Get Customer Withdrawal by ID and order by Date minimum 5 records displayed withdrawals = Witdrawal.objects.filter(account__id=customerID).annotate( transaction_type=Value('withdrawal', output_field=CharField()), account=F('account__acct'), phone=F('account__customer__phone'), amount=F('withdrawal_amount'), date=F('date'), staff_username=F('staff__username'), ).order_by('-date')[:5] # Merge Deposit and Withdrawal queries, and order by Date transactions = sorted( list(deposits) + list(withdrawals), key=lambda x: x.date, reverse=True ) context = { 'transactions': transactions, } return render(request, 'dashboard/statement.html', context) وتعديل القالب HTML على النحو التالي: <table class="table bg-white"> <thead class="bg-info text-white"> <tr> <th scope="col">#</th> <th scope="col">Acct. No.</th> <th scope="col">Phone</th> <th scope="col">Amount</th> <th scope="col">Date</th> <th scope="col">Transaction Type</th> <th scope="col">Staff</th> <th scope="col">Action</th> </tr> </thead> {% if transactions %} <tbody> {% for transaction in transactions %} <tr> <td>{{ forloop.counter }}</td> <td>{{ transaction.account }}</td> <td>{{ transaction.phone }}</td> <td> {% if transaction.transaction_type == 'deposit' %} N{{ transaction.amount|intcomma }} {% elif transaction.transaction_type == 'withdrawal' %} -N{{ transaction.amount|intcomma }} {% endif %} </td> <td>{{ transaction.date|naturaltime }}</td> <td>{{ transaction.transaction_type|title }}</td> <td>{{ transaction.staff_username }}</td> <td><a class="btn btn-success btn-sm
  4. يمكنك استخدام jQuery لتغيير لون الزر بعد الحصول على الرد من الطلب AJAX. يجب عليك تضمين jQuery في قالب HTML الخاص بك. يمكنك تغيير لون الزر باستخدام jQuery عن طريق addClass و removeClass وتعيين فئات CSS تمثل الألوان الخاصة بك. اليك بعض الاكواد التي يمكنك إضافتها إلى قالب HTML الخاص بك: HTML: <!-- add a class to the answer button to select it in jQuery --> <button type="button" class="btn btn-primary display: inline-block width: auto; answer-btn" name="answer" id="submit" value="{{answer}}">{{ answer|safe }}</button> JavaScript: <script type="text/javascript"> // add a click event listener to all answer buttons $('.answer-btn').click(function() { var clickedBtn = $(this); var answer = $(this).val(); var questionCounter = $(this).closest('.card').attr('value'); $.ajax({ type: "POST", url: "check_answer", data: {'answer': answer, 'question_counter': questionCounter}, dataType: "json", success: function(data) { if (data.is_correct) { clickedBtn.addClass('btn-success'); clickedBtn.removeClass('btn-primary'); } else { clickedBtn.addClass('btn-danger'); clickedBtn.removeClass('btn-primary'); } }, error: function(xhr, textStatus, errorThrown) { console.log('Error:', errorThrown); } }); }); </script> في هذا المثال، يتم إضافة كلاس "btn-success" أو "btn-danger" إلى الزر الذي تم النقر عليه، حسبما يكون الجواب الذي تم إرجاعه صحيحًا أو خاطئًا. يتم إزالة فئة "btn-primary" من الزر أيضًا. تأكد من تغيير اسم مسار url في الطلب AJAX "url: 'check_answer'" ليتوافق مع مسار url الخاص بوظيفة Django الخاصة بالتحقق من الإجابة.
  5. لإنشاء عدة صور لكل منشور، يمكنك استخدام مفهوم "العلاقة العكسية المتعددة" (foreign key relationships) في Django. يمكنك إضافة حقل "post" في نموذج "PostsMedia" كمفتاح خارجي foreign key يشير إلى نموذج "Posts". هذا سيسمح لك بإنشاء عدة صور لكل منشور. النماذج بعد التعديل ستكون كالتالي: class Posts(models.Model): user = models.ForeignKey(User, related_name='user_posts', on_delete=models.CASCADE, null=True, blank=True) ###other fields class PostsMedia(models.Model): post = models.ForeignKey(Posts, related_name='post_media', on_delete=models.CASCADE, null=True, blank=True) media = models.URLField(max_length = 500, null=True, blank=True) بعد ذلك، يمكنك إنشاء عدة صور لكل منشور عن طريق إنشاء عدة كائنات (Objects) ل "PostsMedia" وتعيين كل واحدة منها لنموذج "Posts" المناسب. على سبيل المثال: # إنشاء المنشور post = Posts.objects.create(user=user, title=title, content=content) # إنشاء الصور image_urls = ['https://example.com/image1.jpg', 'https://example.com/image2.jpg', 'https://example.com/image3.jpg'] for url in image_urls: PostsMedia.objects.create(post=post, media=url) سينشئ هذا الكود ثلاث صور للمنشور الواحد، مع تخزين عناوين URL لكل صورة في نموذج "PostsMedia". يمكنك الوصول إلى الصور التي تنتمي إلى منشور معين باستخدام "related_name" المحدد في العلاقة في نموذج "PostsMedia". على سبيل المثال: post = Posts.objects.get(id=post_id) post_images = post.post_media.all() هذا سيعيد جميع الصور المرتبطة بالمنشور المعين، ويمكنك الوصول إلى عناوين URL لكل صورة عن طريق الوصول إلى حقل "media" في كل كائن (Object) ال "PostsMedia".
  6. بالطبع، يمكن استخدام طرق مختلفة للحصول على محتوى HTML في Django، بالإضافة إلى render_to_string الذي تم ذكره في الإجابة السابقة. وفيما يلي توضيح لبعض الطرق الأخرى التي يمكن استخدامها: 1- استخدام Template و Context: يمكن استخدام Template لإنشاء نسخة من القالب، و Context لتمرير البيانات إلى القالب، ثم استخدام دالة render() لإنشاء الكود النهائي. فيما يلي مثال بسيط يوضح ذلك: from django.template import Template, Context def get_html(): template = Template("<html><body><h1>Hello {{ name }}</h1></body></html>") context = Context({"name": "John"}) html_content = template.render(context) print(html_content) 2- استخدام HttpResponse: يمكن استخدام HttpResponse لإنشاء استجابة HTTP تحتوي على محتوى HTML من القالب. يمكن إنشاء كائن (Class) HttpResponse وتمريره إلى دالة render()، ثم سيتم إرجاع الكود النهائي من الاستجابة. فيما يلي مثال بسيط يوضح ذلك: from django.http import HttpResponse from django.shortcuts import render def get_html(request): context = {"name": "John"} html_content = render(request, "index.html", context) response = HttpResponse(html_content) return response 3- استخدام get_template: يمكن استخدام get_template للحصول على مثيل من القالب، ثم استخدام دالة render() لإنشاء النص النهائي. فيما يلي مثال بسيط يوضح ذلك: from django.template.loader import get_template def get_html(): template = get_template("index.html") context = {"name": "John"} html_content = template.render(context) print(html_content)
  7. يمكن استخدام عدة طرق مختلفة لجعل الصورة تملأ الشاشة في CSS، وفيما يلي بعض الطرق الممكنة: 1. استخدام خاصية background-size: يمكن استخدام خاصية background-size مع قيمة cover لجعل الصورة تملأ الخلفية بالكامل دون تشويه الأبعاد الأصلية للصورة. يمكن استخدام هذه الخاصية في العناصر التي تستخدم الصورة كخلفية، مثل العناصر div و section و header و body وغيرها. يمكن استخدام الخاصية بهذا الشكل: background-size: cover; 2. استخدام خاصية object-fit: يمكن استخدام خاصية object-fit مع قيمة cover لجعل الصورة تملأ العنصر بالكامل دون تشويه الأبعاد الأصلية للصورة. يمكن استخدام هذه الخاصية في العناصر img و video وغيرها التي تستخدم الصورة كمحتوى داخلي. يمكن استخدام الخاصية بهذا الشكل: object-fit: cover; 3. استخدام العنصر الجديد "picture": يمكن استخدام العنصر الجديد "picture" الذي تم إضافته في HTML5 لجعل الصورة تملأ الشاشة بأفضل شكل ممكن بحيث يتم تحديد مجموعة من الصور بأحجام ودقات مختلفة، وسيتم اختيار الصورة الأنسب تلقائيًا بناءً على حجم الشاشة والجهاز المستخدم. يمكن استخدام العنصر بهذا الشكل: <picture> <source media="(min-width: 768px)" srcset="large-image.jpg"> <source media="(max-width: 767px)" srcset="small-image.jpg"> <img src="fallback-image.jpg" alt="Image"> </picture> يجب تحديد عناصر "source" لتحديد الصور المختلفة وحجم الشاشة المناسب لكل منها، ويجب تحديد عنصر "img" كبديل في حال لم يتم اختيار أي من الصور المحددة في العناصر "source". 4. استخدام وحدة viewport يمكن استخدام وحدة viewport في CSS لتحديد ارتفاع وعرض العرض والارتفاع بالنسبة إلى حجم الشاشة. يمكن تحديد ارتفاع وعرض الصورة بناءً على هذه القيم باستخدام الخاصية height و width بالنسبة المئوية (%). img { width: 100vw; height: 100vh; } في هذا المثال، يتم تعيين ارتفاع وعرض الصورة إلى 100٪ من ارتفاع وعرض العرض والارتفاع بشكل فعلي. هذا يؤدي إلى تحجيم الصورة بحيث تملأ الشاشة بشكل كامل.
  8. الخطأ في الكود هو وجود خطأ إملائي في العنوان URL الذي تم استخدامه للصورة في كلا من index.html وlayout.css. تأكد من استخدام الامتداد الصحيح لملف الصورة والتحقق من أن الملف موجود في المسار الصحيح ,يمكنك القيام بذلك عن طريق القيام بالخطوات التالية: 1. تأكد من وجود ملف الصورة في المسار المطلوب. على سبيل المثال ، إذا كان المسار المطلوب هو "/static/img/background.jpg" ، فتأكد من وجود ملف "background.jpg" في ملف "static/img/". 2.تأكد من أن المسار المستخدم في الكود الخاص بك يتطابق مع المسار الصحيح. يمكنك التحقق من ذلك بفتح ملف HTML الخاص بك والبحث عن العنوان URL الذي تم استخدامه للصورة. على سبيل المثال ، إذا كان المسار المستخدم هو "/static/img/background.jpg" ، فتأكد من أن العنوان URL في ملف HTML الخاص بك يتطابق مع ذلك. 3. تأكد من أن المسار المستخدم في ملف CSS الخاص بك يتطابق مع المسار الصحيح. يمكنك التحقق من ذلك بفتح ملف CSS الخاص بك والبحث عن العنوان URL الذي تم استخدامه للصورة. على سبيل المثال ، إذا كان المسار المستخدم هو "/static/img/background.jpg" ، فتأكد من أن العنوان URL في ملف CSS الخاص بك يتطابق مع ذلك. 4. يمكنك استخدام أدوات المطور لمتصفح الويب الخاص بك للتحقق من المسار المستخدم والتأكد من أنه يشير إلى المسار الصحيح. يمكنك فتح أدوات المطور بالنقر بزر الماوس الأيمن على صفحة الويب الخاصة بك واختيار "عرض الصفحة المصدرية" أو "عرض مصدر الصفحة". ثم يمكنك البحث عن العنوان URL الخاص بالصورة والتحقق من المسار المستخدم.
  9. في ال endpoint اللتي سوف تقوم بارسال الrequest اليها
  10. لإضافة خاصية إدخال عنوان على الخريطة لموقع المستخدم في موقع الويب باستخدام Django، يمكنك اتباع الخطوات التالية: 1. قم بتسجيل حساب في Google Cloud Platform وإنشاء مفتاح API لـ Google Maps. 2. قم بتثبيت مكتبة django-google-maps باستخدام الأمر التالي: pip install django-google-maps 3. قم بإضافة 'django_google_maps' إلى قائمة INSTALLED_APPS في ملف settings.py الخاص بتطبيق Django الخاص بك. 4. في ملف forms.py الخاص بتطبيقك، قم بإنشاء نموذج Django الذي يحتوي على حقل الخريطة باستخدام GoogleMapLocationField من مكتبة django-google-maps. مثال: from django import forms from django_google_maps.fields import GoogleMapLocationField class LocationForm(forms.Form): location = GoogleMapLocationField() 5. في ملف views.py الخاص بتطبيقك، قم بإنشاء دالة view التي تقوم بعرض نموذج الخريطة ومعالجة البيانات التي تم إرسالها. مثال: from django.shortcuts import render from .forms import LocationForm def location_view(request): if request.method == 'POST': form = LocationForm(request.POST) if form.is_valid(): # تم التحقق من صحة البيانات المدخلة location = form.cleaned_data['location'] # تم استلام الإحداثيات الجغرافية للموقع المدخل # يمكن استخدامها لإظهار معلومات الموقع على الخريطة أو التخزين في قاعدة البيانات else: form = LocationForm() return render(request, 'location.html', {'form': form}) 6. في ملف location.html، يمكنك إضافة نموذج الخريطة باستخدام الأمر التالي: {% extends 'base.html' %} {% block content %} <form method="post"> {% csrf_token %} {{ form.as_p }} <button type="submit">Submit</button> </form> {% endblock %} {% block scripts %} {{ form.media }} {% endblock %} هذا سيقوم بإنشاء نموذج HTML الذي يحتوي على خريطة Google Maps.
  11. لتحقيق ذلك، يمكنك استخدام وسم HTML المناسب لتنسيق النص. يمكنك استخدام وسم <strong> لجعل النص ثقيل الوزن وبخط عريض (bold). يمكنك استخدامه بالتالي: class modela(models.Model): fielda = models.BooleanField(default=True, choices=((True, 'some <strong> bold </strong> text'), (False, 'zzz'))) بهذا الشكل، ستتم عرض عبارة "bold" بخط ثقيل وعريض.
  12. لديك بعض الأخطاء في الكود، إذا لم تعمل الأحداث الخاصة بالزر، فمن المحتمل أن يكون هناك مشكلة في تحديد عنصر HTML بشكل صحيح، ويجب أن تتحقق من العناصر الخاصة بك بأنها متاحة عندما يتم تحميل الصفحة. يمكنك استخدام الكود التالي لتحقق من الأخطاء وإصلاحها: قم بتحويل الكود الخاص بالأحداث إلى دالتين منفصلتين، لتحديد العناصر وتعيين الأحداث. قم بوضع الكود الخاص بتحديد العناصر وتعيين الأحداث داخل حدث DOMContentLoaded. قم بالتحقق من أن العناصر التي تحاول تحديدها متاحة عندما يتم تحميل الصفحة. تحقق من أنك تقوم بتشغيل الكود الخاص بالأحداث في نفس الملف الذي توجد به عناصر HTML الخاصة بك. قم بتغيير الكود الخاص بك إلى ما يلي: document.addEventListener('DOMContentLoaded', () => { const plusBtn = document.querySelector('#plus'); const minusBtn = document.querySelector('#minus'); const inputQty = document.querySelector('#inputQty'); plusBtn.addEventListener('click', e => { e.preventDefault(); inputQty.value = parseInt(inputQty.value) + 1; }); minusBtn.addEventListener('click', e => { e.preventDefault(); if (inputQty.value <= 0) { inputQty.value = 0; } inputQty.value = parseInt(inputQty.value) - 1; }); }); هذا الكود سيحدد العناصر المناسبة ويعين الأحداث داخل حدث DOMContentLoaded. إذا كانت هناك مشكلة في تحديد العناصر، فسيتم طباعة رسالة خطأ في وحدة تحكم المتصفح، يمكنك الاطلاع عليها لتحديد المشكلة. بعد تغيير الكود، سوف تتمكن من زيادة وتقليل قيمة الإدخال بشكل صحيح عند النقر على زر الإضافة والطرح، وسيتم التحقق من أن القيمة لا يمكن ان تكون بالسالب.
  13. بشكل عام ، البرمجة الشيئية (OOP) ليست شرطًا لتعلم هياكل البيانات في بايثون. ومع ذلك ، فإن معرفة البرمجة الشيئية يمكن أن تساعدك في فهم أفضل لكيفية تصميم وتنفيذ هياكل البيانات. في البرمجة الشيئية ، يتم التركيز على الكائنات والمتغيرات والدوال ، والتي تعد جزءًا أساسيًا من تصميم هياكل البيانات. بالإضافة إلى ذلك ، يستخدم معظم تصميمات هياكل البيانات في البرمجة الشيئية تقنيات مثل الوراثة والتعددية والتعامل مع الاستثناءات وغيرها من المفاهيم المتعلقة بالبرمجة الشيئية. لذلك ، فإن البرمجة الشيئية يمكن أن تكون مفيدة في تعلم هياكل البيانات وفهمها بشكل أفضل. ومع ذلك ، يمكن البدء في تعلم هياكل البيانات دون الحاجة إلى معرفة البرمجة الشيئية ، وبمجرد تعلم الأساسيات ، يمكن العودة لتعلم المفاهيم المتقدمة في البرمجة الشيئية إذا لزم الأمر.
  14. يبدو أن المشكلة في استخدام نفس الـ ids في كل من الجدولين. يجب استخدام ids مختلفة لكل جدول ، حتى يتمكن المتصفح من التعرف على الفرق بين الحقول في النموذجين. بدلاً من استخدام id="subject",id="aclass", وid="submit" في النموذجين ، يجب تغييرها إلى شيء مختلف مثل id="subject1",id="aclass1",id="submit1" للنموذج الأول و id="subject2",id="aclass2",id="submit2" للنموذج الثاني. عند إرسال البيانات للقاعدة من الجدول الثاني ، يجب التأكد من استخدام الملف الصحيح في الـ URL ، بحيث يتم إرسال البيانات إلى send_saturday_two.php بدلاً من send_saturday_tow.php كما هو موجود في الكود الثاني. وايضا من الأفضل استخدام معيار قياسي لحفظ البيانات في الجدول مثل استخدام أحرف صغيرة لأسماء الجداول والأعمدة وتجنب الأخطاء الإملائية ، ويمكن أيضًا استخدام العلامات التعريفية الخاصة بـ HTML5 لتحديد نوع البيانات المتوقعة لكل حقل في الجدول.
  15. وصف المنشور موجود في قالب blog-single.html وهو مكان لإظهار تفاصيل المنشور وتنسيقها والسماح للمستخدمين بقراءتها. لإظهار وصف المنشور بطريقة مناسبة، يمكنك إضافة تفاصيل المنشور المناسبة في العنصر <p class="post__description"> بعد استدعاء السمة description من نموذج Post باستخدام {{ posts.description|safe }}. ويمكن تنسيق الوصف بأي طريقة تريدها، مثل إضافة عناوين، فقرات، وربما قوائم نقطية.
  16. يبدو أن البيانات التي قدمتها تحتوي على قائمة من العناصر، حيث تحتوي العنصر الأول على بيانات شهر يناير والعنصر الثاني على بيانات شهر فبراير. لتحويل البيانات إلى الصيغة المتوقعة، يمكنك استخدام الكود التالي: data[0]["February"] = data[1]["February"] del data[1] سيحل هذا الكود مشكلتك بحيث يضيف القيم الموجودة في قائمة فبراير إلى العنصر الأول من القائمة (يناير)، ثم يحذف العنصر الثاني من القائمة بعد ذلك. بعد تشغيل هذا الكود، سيكون النتيجة المتوقعة كما هو موضح في سؤالك.
  17. يمكن استخدام Firebase كخادم للعبة التي تم إنشاؤها على موقع كودلر بطريقة بسيطة. يمكنك استخدام Firebase Realtime Database لتخزين وجلب بيانات النتيجة والتفاعلات الأخرى في اللعبة. وهذه خطوات عامة لإضافة Firebase إلى لعبتك على موقع كودلر وتخزين النتائج: قم بإنشاء مشروع Firebase جديد عبر موقع Firebase. بعد إنشاء مشروع Firebase الجديد، انتقل إلى قائمة "إضافة Firebase إلى تطبيق الويب". اسمح بإضافة مشروع Firebase إلى تطبيق الويب عن طريق إدخال اسم التطبيق. قم بتحميل ملف التكوين Firebase الذي تم إنشاؤه وقم بإدراجه في مشروع اللعبة الخاص بك على موقع كودلر. استخدم مكتبة Firebase في لعبتك لتخزين النتائج في Firebase Realtime Database. يمكنك استخدام Firebase Realtime Database لتخزين وجلب بيانات النتيجة والتفاعلات الأخرى في اللعبة. يمكنك استخدام API الخاص بـ Firebase Realtime Database لتسجيل اللاعبين وتخزين النتائج. يمكنك أيضًا استخدام Firebase Authentication للتحقق من هوية اللاعبين وتأمين بياناتهم. بمجرد تخزين النتيجة في Firebase، يمكنك استخدام Firebase Functions لتنفيذ التعليمات البرمجية على البيانات المخزنة في Firebase Realtime Database وتوليد تحليلات وتقارير مخصصة. يمكنك الاطلاع على وثائق Firebase لمزيد من المعلومات والمساعدة في البدء في استخدام Firebase Realtime Database وFirebase Functions.
  18. يتم وجود هذا الخطأ بسبب أن نموذج المستخدم الافتراضي في جانجو auth.User قد تم تعديله باستخدام AbstractUser في التطبيق الخاص بك account.User. ومع ذلك ، يتم الإشارة إلى النموذج الافتراضي في الحقل الخاص بك Article.author كموديل خاص بمستخدمي Django الذي تم تعديله. لحل هذا المشكلة ، يمكنك تغيير الحقل author في النموذج Article بحيث يشير إلى نموذج المستخدم الخاص بك. ويمكنك القيام بذلك عن طريق استخدام settings.AUTH_USER_MODEL بدلاً من User عند تعريف الحقل ، على النحو التالي: from django.conf import settings class Article(models.Model): author = models.ForeignKey(settings.AUTH_USER_MODEL, null=True, on_delete=models.SET_NULL, related_name='articles', verbose_name='test') وبذلك ، يشير الحقل author الآن إلى نموذج المستخدم المخصص الخاص بك بدلاً من نموذج المستخدم الافتراضي في Django.
  19. يمكنك الحصول على بيانات المصادقة في طريقة list باستخدام request.user للوصول إلى معلومات المستخدم المصادق. يمكنك استخدام هذه المعلومات في إنشاء الاستعلام لاسترداد الرسومات التي يملكها المستخدم. يمكنك تحديد المستخدم باستخدام filterset_fields كما هو موضح في الكود الذي قمت بتقديمه. مثال على كيفية استخدام request.user في القائمة: class DrawingViewSet(viewsets.ModelViewSet): queryset = m.Drawing.objects.all() serializer_class = s.DrawingSerializer filterset_fields = ['user'] def list(self, request): queryset = m.Drawing.objects.filter(user=request.user) serializer = s.DrawingSerializer(queryset, many=True) return Response(serializer.data) في هذا المثال، ستتم فلترة الرسومات التي يملكها المستخدم المصادق عن طريق استخدام request.user وإرجاع النتائج باستخدام serializer.
  20. إذا كنت تريد استرجاع الاسم فقط، يمكنك استخدام قائمة الحقول values_list بدلاً من values. يمكنك استخدام flat=True لإرجاع قيمة واحدة فقط بدلاً من قائمة. يمكنك تجربة الآتي: attendance_record = Attendance.objects.filter(date=date).values_list('employee__name', flat=True) سترجع هذه الطريقة قائمة تحتوي على الأسماء فقط.
  21. إذا قمتي بإضافة الصلاحيات اللازمة للمستخدم الجديد ولم يتمكن المستخدم الجديد أو المستخدم الحالي الذي لديه صلاحية الدخول إلى لوحة التحكم الإدارية ، يمكنك التحقق من عدة أمور: 1- التأكد من أن اسم المستخدم وكلمة المرور الخاصة بالمسؤول صحيحة، وأنه تم إدخالهما بشكل صحيح في نموذج تسجيل الدخول. 2- التأكد من أن المسؤول ينتمي إلى المجموعة التي تحتوي على الصلاحيات اللازمة لتسجيل الدخول. يمكن التحقق من ذلك بالتأكد من أن المستخدم الجديد أو المستخدم الحالي تمت إضافته إلى المجموعة الصحيحة في صفحة الإدارة Admin Panel. 3- التأكد من أن إعدادات المشروع الخاص بك صحيحة، وأن قيمة AUTHENTICATION_BACKENDS في ملف settings.py تحتوي على الباكند الصحيح المستخدم للتحقق من صلاحيات المستخدمين. 4- قد يكون هناك خطأ في تكوين إعدادات الجلسة (session) في Django. يمكنك التحقق من إعدادات الجلسة في ملف settings.py والتأكد من أنها صحيحة وتسمح للمسؤول بتسجيل الدخول.
  22. كود ال views يبدو صحيحا، و كود HTML الخاص بك ايضا. كما يبدو أن قيمة UPLOAD_FOLDER الخاص بك تعطي المسار الصحيح إلى مجلد التحميل. في حال عدم العثور على الصورة، يمكنك التأكد من أن الصورة موجودة في مجلد التحميل وأن المسار الصحيح يوجد في كود views الخاص بك. كما يمكن أن يكون هناك مشكلة في تصريح الأذونات للمجلد، يمكنك التأكد من أن جميع الأذونات للمجلد تم تصريحها بشكل صحيح.
  23. لجعل الموقع التعريفي الخاص بك يعمل بطريقة ديناميكية (تستطيع التحكم في البيانات بدون التعديل في ال Source Code) كمطور واجهات أمامية، يمكن جعل المشاريع الخاصه بك ديناميكية عن طريق JavaScript و API اذا كان يوجد Api جاهز. لاحظ أن هذا الحل سيكون أكثر عرضة للمخاطر ، ولذلك يفضل الاعتماد على تطوير الواجهات الخلفية للتعامل مع بعض المهام الأساسية مثل تخزين البيانات و برمجة لوحة التحكم وما الي ذلك.
  24. لحل المشكلة الأولى، يمكن إضافة الأمر self.wt.SetLabel(f"اكتب حرف {self.letter} ") في دالة 'onsend' بعد تعديل الحرف الذي يجب كتابته. لحل المشكلة الثانية، يمكن استخدام الأمر ' self.write.SetValue("") ' بدلاً من ' self.write.Value="" ' لتفريغ مربع الكتابة. الكود بعد التعديل: import wx import winsound enletters = ['a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i', 'j', 'k', 'l', 'm', 'n', 'o', 'p', 'q', 'r', 's', 't', 'u', 'v', 'w', 'x', 'y', 'z'] class len(wx.Frame): def __init__(self, parent): super(len, self).__init__(parent, -1, title='النظام التعليمي, الأحرف الإنجليزية المرتبة') self.p = wx.Panel(self, -1) self.lettern = 0 self.letter = enletters[self.lettern] wx.StaticText(self.p, -1, "الإجابات: ") self.verify = wx.TextCtrl(self.p, -1, style=wx.TE_READONLY + wx.TE_MULTILINE + wx.HSCROLL) self.prompt = wx.StaticText(self.p, -1, f"اكتب حرف {self.letter} ") self.write = wx.TextCtrl(self.p, -1) self.write.SetFocus() self.send = wx.Button(self.p, -1, "إرسال الإجابة") self.send.Bind(wx.EVT_BUTTON, self.onsend) self.Show() def onsend(self, event): answer = self.write.GetValue() if answer == self.letter: self.verify.write(f'صحيح {self.letter}\n') winsound.PlaySound('data\\yes.wav', winsound.SND_FILENAME) self.letter_index += 1 if self.lettern >= len(enletters): self.lettern = 0 self.letter = enletters[self.lettern] self.prompt.SetLabel(f"اكتب حرف {self.letter} ") self.write.SetFocus() self.write.SetValue("") app = wx.App() len(None) app.MainLoop()
  25. ها هي كيفية عمل الجزء الأمامي في جانغو بالتفاصيل: Templates: جانجو يستخدم الTemplates لعرض صفحات HTML على الجانب المستخدم. القالب هو ملف نصي بسيط يحدد البنية ومحتوى صفحة الويب. يمكن تضمين متغيرات في القوالب مما يجعل من الممكن عرض الصفحات مع المحتوى الديناميكي. Static Files: عادة ما يشمل الواجهة الأمامية لتطبيق Django عدة ملفات ثابتة، مثل CSS، JavaScript، والصور، التي تستخدم لتنسيق وتفاعل مع واجهة المستخدم فهو يوفر طريقة مدمجة لإدارة هذه الملفات وتقديمها للعميل. URL Mapping: جانجو يقوم بربط العناوين URL مع الدوال المخصصه لها في ملف ال views.py، وهي دوال بايثون التي تتحكم في الطلبات الواردة وتعيد HTTP Responses. يمكن تعريف العناوين URL في ملف urls.py، ويمكن تعريف الدوال في ملف views.py. عندما يطلب المستخدم عنوان URL، يتم تنفيذ الدالة المرتبطة بهذا الرابط(العنوان) ويمكن له استخدام القوالب والملفات الثابتة لتقديم رد. Forms: النماذج هي طريقة لجمع مدخلات المستخدم وإرسالها إلى الواجهة الخلفية للمعالجة. Django يوفر طريقة مريحة لإنشاء ومعالجة النماذج، ويشمل ميزات للتحقق من صحة النموذج، معالجة الأخطاء، والأمان. JavaScript: يستخدم JavaScript عادة في الجزء الأمامي لتطبيقات Django لإضافة تفاعل ديناميكي إلى واجهة المستخدم. على سبيل المثال، يمكنك استخدام JavaScript لتحديث محتوى صفحة دون إعادة تحميل الصفحة بأكملها، أو للتحقق من مدخلات النموذج قبل إرسالها. تلخيصًا، الواجهة الامامية في جانغو مسؤولة عن عرض واجهة المستخدم والتعامل مع التفاعلات الخاصة بالمستخدم، ويتواصل مع الواجهة الخلفية عبر واجهات برمجة التطبيقات ( API's ). جانغو يوفر طريقة مرنة وقوية لبناء الواجهة الأمامية لتطبيقات الويب، بمزايا كالقوالب، الملفات الثابتة، تعيين الروابط، الإستمارات، وجافا سكريبت اللتي فصلناها في الاعلي. للمزيد من التفاصيل انصحك بقراءه الDocs الخاصة بالواجهة الامامية من هنا
×
×
  • أضف...