-
المساهمات
510 -
تاريخ الانضمام
-
تاريخ آخر زيارة
-
عدد الأيام التي تصدر بها
5
نوع المحتوى
ريادة الأعمال
البرمجة
التصميم
DevOps
التسويق والمبيعات
العمل الحر
البرامج والتطبيقات
آخر التحديثات
قصص نجاح
أسئلة وأجوبة
كتب
دورات
كل منشورات العضو Ahmed Sadek Elamine Touahria
-
نستخدم حقول النموذج الديناميكي في العديد من السيناريوهات ، مثل إنشاء قائمة مهام أو أي نموذج آخر قد يحتوي على حقل واحد أو أكثر من الحقول المطلوبة. بناء هيكل HTML ضروري ، نبدأ من بنية HTML لحقول النموذج الديناميكي الخاصة بنا. <h1>الحقول الديناميكية</h1> <div class="wrapper"> <div id="survey_options"> <input type="text" name="survey_options[]" class="survey_options" size="50" placeholder="Name"> <input type="text" name="survey_options[]" class="survey_options" size="50" placeholder="Email"> <input type="text" name="survey_options[]" class="survey_options" size="50" placeholder="Another Field"> </div> <div class="controls"> <a href="#" id="add_more_fields"><i class="fa fa-plus"></i>إضافة</a> <a href="#" id="remove_fields"><i class="fa fa-plus"></i>حذف</a> </div> </div> لقد قمت بتضمين ثلاثة حقول فقط ، اثنان منهم (الاسم والبريد الإلكتروني) ثابتان وأنا أجعل الحقل الأخير حقل آخر ديناميكيًا ، حيث سنقوم بتنفيذ الإجراءات. يبدو قبيح جدا. أليس كذلك؟ لنقم ببعض تصميمات CSS لجعلها جذابة. @import url('https://fonts.googleapis.com/css2?family=Jost:wght@100;300;400;700&display=swap'); body { background-color: #f0f5ff; font-family: 'Jost',sans-serif; color: #fff; } .wrapper { width: 400px; margin: 40px auto; padding: 10px; border-radius: 5px; background: white; box-shadow: 0px 10px 40px 0px rgba(47,47,47,.1); } input[type="text"]{ padding: 10px; margin: 10px auto; display: block; border-radius: 5px; border: 1px solid lightgrey; background: none; width: 274px; color: black; } input[type="text"]:focus { outline: none; } .controls { width: 294px; margin: 15px auto; } #remove_fields { float: right; } .controls a i.fa-minus { margin-right: 5px; } a { color: black; text-decoration: none; } h1 { text-align: center; font-size: 48px; color: #232c3d; } ما الذي يجعل النموذج تفاعليًا؟ بالتأكيد ، جافا سكريبت. var survey_options = document.getElementById('survey_options'); var add_more_fields = document.getElementById('add_more_fields'); var remove_fields = document.getElementById('remove_fields'); add_more_fields.onclick = function(){ var newField = document.createElement('input'); newField.setAttribute('type','text'); newField.setAttribute('name','survey_options[]'); newField.setAttribute('class','survey_options'); newField.setAttribute('siz',50); newField.setAttribute('placeholder','Another Field'); survey_options.appendChild(newField); } remove_fields.onclick = function(){ var input_tags = survey_options.getElementsByTagName('input'); if(input_tags.length > 2) { survey_options.removeChild(input_tags[(input_tags.length) - 1]); } } document.getElementById('print-values-btn').onclick = function() { let allTextBoxes = document.getElementsByName('survey_options[]'); for(let i of allTextBoxes){ console.log(i.value) // هنا ستتمكن من رؤية جميع القيم في console } } شرح الكود في الأسطر الثلاثة الأولى ، لدي الحقل الذي سيكون ديناميكيًا وزر عناصر التحكم (إضافة وإزالة) لأداء أحداث onclick. أقوم الآن بإنشاء عنصر إدخال جديد كلما تم تنفيذ حدث النقر على add_more_fields. في الواقع ، يقوم بإنشاء عناصر إدخال وإضافة سمات إليها مثل النوع والاسم والفئة وما إلى ذلك. نحتاج أيضًا إلى الإزالة أيضًا. نحتاج أولاً إلى التحقق من أن طول الإدخال أكبر من 2 ، ثم سنزيله بخلاف ذلك. إذا كان لدينا أكثر من مجالين. ثم ببساطة استخدم وظيفة JS removeChild واجتياز رقم الفهرس الخاص بـ Survey_options.
- 4 اجابة
-
- 2
-
عند الانتهاء من المشروع تقوم بإرفاق مجلد المشروع مع ملف backup حتى يستطيع الشخص التعامل مع نفس البيانات بواسطة عمل restore database التي وضحتها في الإجابة السابقة
- 3 اجابة
-
- 1
-
- 3 اجابة
-
- 1
-
تبديل متغيرين يشير تبادل متغيرين إلى التبادل المتبادل لقيم المتغيرات. بشكل عام ، يتم ذلك مع البيانات الموجودة في الذاكرة. إن أبسط طريقة لمبادلة متغيرين هي استخدام متغير مؤقت ثالث: فيما يلي الخطوات البسيطة التي نتبعها: قم بتعيين x لمتغير temp: temp = x خصص y لـ x: x = y تعيين temp إلى y: y = temp دعونا نفهم بمثال. public class SwapTwoNumbers { public static void main(String[] args) { int x = 100, y = 200; System.out.println("قبل التبديل"); System.out.println("x = " + x); System.out.println("y = " + y); int temp = x; x = y; y = temp; System.out.println("بعد التبديل"); System.out.println("x = " + x); System.out.println("y = " + y); } }
-
أرقام فيبوناتشي هي الأرقام الموجودة في تسلسل الأعداد الصحيحة التالية. 0 ، 1 ، 1 ، 2 ، 3 ، 5 ، 8 ، 13 ، 21 ، 34 ، 55 ، 89 ، 144 ، …… .. من الناحية الرياضية ، يتم تحديد تسلسل Fn لأرقام فيبوناتشي من خلال علاقة التكرار Fn = Fn-1 + Fn-2 F0 = 0 and F1 = 1. الطريقة الأسهل هي استعمال العودية ولكن تستغرق وقت حتى يتم ينفيذها def fibonacci(n): if n <= 1: return n return fibonacci(n-1) + fibonacci(n-2) درجة التعقيد هي 2 قوى n ، وهي كبيرة جدا لأن هذه هي العميات التي تتم fib(5) / \ fib(4) fib(3) / \ / \ fib(3) fib(2) fib(2) fib(1) / \ / \ / \ fib(2) fib(1) fib(1) fib(0) fib(1) fib(0) / \ fib(1) fib(0) لحساب fib(5) يتم تنفيذ 15 عملية وهذا غير جيد . الطريقة الثانية باستعمال البرمجة الديناميكية def fibonacci(n): # أخذ أول رقمين فيبوناتشي على هيئة 0 و 1 f = [0, 1] for i in range(2, n+1): # نملأ الجدول f.append(f[i-1] + f[i-2]) return f[n] print(fibonacci(9)) درجة التعقيد هنا هي فقط O(n) الطريقة الثالثة باستعمال المصفوفات طريقة صعبة ولكن ذو سرعة عالية وتعقيد اقل MAX = 1000 # إنشاء مجموعة للحفظ f = [0] * MAX # إرجاع رقم فيبوناتشي n باستخدام الجدول f [] def fib(n) : # الحالات الأساسية if (n == 0) : return 0 if (n == 1 or n == 2) : f[n] = 1 return (f[n]) # إذا تم حساب Fib (n) بالفعل if (f[n]) : return f[n] if( n & 1) : k = (n + 1) // 2 else : k = n // 2 # تطبيق الصيغة أعلاه [قيمة الملاحظة n & 1 هي 1 # إذا كان n فرديا ، وإلا 0. if((n & 1) ) : f[n] = (fib(k) * fib(k) + fib(k-1) * fib(k-1)) else : f[n] = (2*fib(k-1) + fib(k))*fib(k) return f[n] درجة التعقيد هنا هي فقط O(logn) فقط !
- 3 اجابة
-
- 2
-
تقوم طريقة update() بتحديث القاموس بعناصر من كائن قاموس آخر أو من أزواج مفاتيح / قيمة متكررة. لها عدة استخدامات ، مثل : المثال الأول: التحديث باستخدام قاموس آخر # قاموس مع ثلاثة عناصر Dictionary1 = {'A': 'Hsoub', 'B': 'For', } Dictionary2 = {'B': 'Hsoub'} # القاموس قبل التحديث print("Original Dictionary:") print(Dictionary1) #تحديث قيمة المفتاح B Dictionary1.update(Dictionary2) print("Dictionary after updation:") print(Dictionary1) المخرجات Original Dictionary: {'A': 'Hsoub', 'B': 'For'} Dictionary after updation: {'A': 'Hsoub', 'B': 'Hsoub'} المثال الثاني: التحديث باستخدام Iterable # قاموس يحتوي على عنصر واحد Dictionary1 = {'A': 'hsoub'} # القاموس قبل التحديث print("Original Dictionary:") print(Dictionary1) # تحديث القاموس مع التكرارات Dictionary1.update(B='For', C='hsoub') print("Dictionary after updation:") print(Dictionary1) المخرجات Original Dictionary: {'A': 'hsoub'} Dictionary after updation: {'C': 'hsoub', 'B': 'For', 'A': 'hsoub'} المثال الثالث: قيمة تحديث قاموس Python إذا كان المفتاح موجودًا def checkKey(dict, key): if key in dict.keys(): print("Key exist, ", end =" ") dict.update({'m':600}) print("value updated =", 600) else: print("Not Exist") dict = {'m': 700, 'n':100, 't':500} key = 'm' checkKey(dict, key) print(dict) المخرجات Key exist, value updated = 600 {'m': 600, 'n': 100, 't': 500}
-
عمل backup باستعمال الحزمة django-dbbackup يوفر تطبيق Django هذا أوامر إدارية للمساعدة في النسخ الاحتياطي واستعادة قاعدة بيانات المشروع وملفات الوسائط بمخازن متنوعة مثل Amazon S3 أو Dropbox أو تخزين الملفات المحلي أو أي تخزين على Django. تم تصميمه من أجل: السماح لك بتأمين نسختك الاحتياطية بتوقيع GPG وأرشيف التشفير مع الضغط. تعامل بسهولة مع الأرشفة عن بُعد. حافظ على تحديث قاعدة بيانات التطوير الخاصة بك ، استخدم Crontab أو Celery لإعداد النسخ الاحتياطية التلقائية لذلك سنتعامل مع حزمة django-dbbackup ستساعدنا في هذا الشيء pip install django-dbbackup ثم نعمل تهيئة في ملف الإعدادات INSTALLED_APPS = ( ... 'dbbackup', # django-dbbackup ) DBBACKUP_STORAGE = 'django.core.files.storage.FileSystemStorage' DBBACKUP_STORAGE_OPTIONS = {'location': '/my/backup/dir/'} يستخدم هذا التكوين تخزين نظام الملفات ، ولكن يمكنك استخدام أي تخزين تدعمه واجهة برمجة تطبيقات Django. انظر إعدادات التخزين لمزيد من المعلومات حول هذا الموضوع. اختبار أن كل شيء يعمل $ python manage.py dbbackup
- 1 جواب
-
- 1
-
تم تصميم HTML مع مراعاة القابلية للتوسعة للبيانات التي يجب أن ترتبط بعنصر معين ولكن لا يلزم أن يكون لها أي معنى محدد. تسمح لنا سمات data- * بتخزين معلومات إضافية حول عناصر HTML القياسية والدلالات دون الاختراقات الأخرى مثل السمات غير القياسية أو الخصائص الإضافية على DOM. بناء syntax بسيط. أي سمة على أي عنصر يبدأ اسم السمة ب data- هي سمة بيانات. لنفترض أن لديك مقالًا وتريد تخزين بعض المعلومات الإضافية التي لا تحتوي على أي تمثيل مرئي. فقط استخدم سمات البيانات لذلك: <article id="electric-cars" data-columns="3" data-index-number="12314" data-parent="cars"> … </article> الوصول من javascript قراءة قيم هذه السمات في JavaScript بسيطة للغاية أيضًا. يمكنك استخدام getAttribute () مع اسم HTML الكامل لقراءتها ، لكن المعيار يحدد طريقة أبسط: DOMStringMap يمكنك قراءته عبر خاصية مجموعة البيانات. للحصول على سمة بيانات من خلال كائن مجموعة البيانات ، احصل على الخاصية بجزء من اسم السمة بعد " data- " (لاحظ أنه يتم تحويل الشرطات إلى camelCase). const article = document.querySelector("#electric-cars"); article.dataset.columns; // "3" article.dataset.indexNumber; // "12314" article.dataset.parent; // "cars" تفحص أكثر https://wiki.hsoub.com/CSS/attr https://wiki.hsoub.com/HTML
- 2 اجابة
-
- 1
-
توجد مكتبة مشهورة لتحميل مقاطع اليوتيوب ، pytube يغطي هذا الدليل أبسط استخدامات المكتبة. لمزيد من المعلومات التفصيلية ، يرجى الرجوع إلى pytube.io. تثبيت الحزمة أو المكتبة python -m pip install pytube لتنزيل مقطع فيديو باستخدام المكتبة في برنامج نصي ، ستحتاج إلى استيراد فصل YouTube من المكتبة وتمرير وسيطة لعنوان URL للفيديو. من هناك ، يمكنك الوصول إلى التدفقات وتنزيلها. >>> from pytube import YouTube >>> YouTube('https://youtu.be/2lAe1cqCOXo').streams.first().download() >>> yt = YouTube('http://youtube.com/watch?v=2lAe1cqCOXo') >>> yt.streams ... .filter(progressive=True, file_extension='mp4') ... .order_by('resolution') ... .desc() ... .first() ... .download() بالنسبة لتيكتوك أنصحك بالحزمة TikTokApi
- 1 جواب
-
- 2
-
الأمر بسيط ، تقوم بتحميل الحزم django-rest-sms-auth و twilio pip install django-rest-sms-auth twilio ثم تسجيلها في الإعدادات INSTALLED_APPS = [ 'django.contrib.admin', 'django.contrib.auth', ... 'sms_auth', 'sms_auth.providers.twilio' ] SMS_AUTH_SETTINGS = { "SMS_CELERY_FILE_NAME": "run_celery", # ملف celery ، "SMS_AUTH_SUCCESS_KEY": "jwt_token", "SMS_AUTH_PROVIDER_FROM": "ex: +7542222222", # رقم الهاتف # If twilio "SMS_AUTH_ACCOUNT_SID": "Twilio SID" "SMS_AUTH_AUTH_TOKEN": "Twilio token" } ثم اعمل تهجير البيانات python manage.py makemigrations sms_auth && python manage.py migrate ملف urls path('auth/', include('sms_auth.api.urls')) طريقة التحقق : POST /auth/auth/ body: { "phone_number":"user phone number", "code":sms_code } result: 200/400 response (with token)
- 2 اجابة
-
- 2
-
يمكنك باستعمال الحزمة GeoIP2 from django.shortcuts import render, HttpResponse from django.contrib.gis.geoip2 import GeoIP2 def home(request): x_forwarded_for = request.META.get('HTTP_X_FORWARDED_FOR') if x_forwarded_for: ip = x_forwarded_for.split(',')[0] else: ip = request.META.get('REMOTE_ADDR') device_type = "" browser_type = "" browser_version = "" os_type = "" os_version = "" if request.user_agent.is_mobile: device_type = "Mobile" if request.user_agent.is_tablet: device_type = "Tablet" if request.user_agent.is_pc: device_type = "PC" browser_type = request.user_agent.browser.family browser_version = request.user_agent.browser.version_string os_type = request.user_agent.os.family os_version = request.user_agent.os.version_string g = GeoIP2() # إنشاء كائن من GeoIP2 location = g.city(ip) # جلب المدينة أو الحداثيات ، حسب ما تريد location_country = location["country_name"] location_city = location["city"] context = { "ip": ip, "device_type": device_type, "browser_type": browser_type, "browser_version": browser_version, "os_type":os_type, "os_version":os_version, "location_country": location_country, "location_city": location_city } return render(request, "home.html", context)
- 4 اجابة
-
- 1
-
أقترح عليك استخدام AsyncStorage. يمكنه تخزين بيانات json وكذلك البيانات العادية محليًا أيضًا. إذا كنت تعمل على إضافة "تذكر تسجيل الدخول" ، فاستخدم هذا المنطق - بمجرد تسجيل دخول المستخدم في التطبيق ، قم بتخزين البيانات في AsyncStorage باستخدام AsyncStorage.setItem () login = ( username, password, ) => { axios .post(apiEndPoint + "login", { username, password, }) .then(async (response) => { if (response.data) { if (response.data.success) { this.storeData(response.data); this.props.navigation.replace("HomeScreen"); } else { toast.show(response.data.message); } } else { toast.show("هناك بعض المشاكل مع API"); } }) .catch((err) => { toast.show("هناك بعض المشاكل مع API"); }); }; storeData = async (userData) => { try { await AsyncStorage.setItem("userdata", JSON.stringify(userData)); } catch (error) { console.log("خطأ أثناء تخزين البيانات", error); } };
-
مثلا ، نأخذ هذا السكريبت def catch(): ... try: ... asd() ... except Exception as e: ... print e.message, e.args ... >>> catch() global name 'asd' is not defined ("الاسم asd غير معرف",) لكنه لا يمسك BaseException أو استثناءات الخروج من النظام SystemExit و KeyboardInterrupt و GeneratorExit: >>> def catch(): ... try: ... raise BaseException() ... except Exception as e: ... print e.message, e.args ... >>> catch() Traceback (most recent call last): File "<stdin>", line 1, in <module> File "<stdin>", line 3, in catch BaseException >>> def catch(): ... try: ... raise BaseException() ... except: ... pass ... >>> catch() >>> تنبع جميع الاستثناءات من BaseException ، وتلك التي من المفترض أن تلتقطها يومًا بعد يوم (تلك التي سيتم طرحها للمبرمج) ترث أيضًا من Exception.
- 1 جواب
-
- 1
-
1 - توضيح حول action design pattern laravel "نمط تصميم الإجراء" هو طريقة بسيطة ولكنها نظيفة وفعالة لإعادة استخدام منطق الأعمال في Laravel. لنبدأ بتطبيق إدارة الخادم. لدى المستخدم خوادم ، ثم في يوم واحد ، يريد المستخدم أرشفة الخادم. المتحكم للقيام بذلك قد يكون: namespace App\Http\Controllers; use App\Models\Server; class ArchivedServersController extends Controller { public function store(Server $server) { $this->authorize('update', $server); $server->markAsArchived(); $server->owner->notify(new ServerArchivedNotification($server)); return $server; } } هذه طريقة Laravel نموذجية. منطق الأعمال مخفي في النموذج مثل: class Server extends Model { public function markAsArchived() { return tap($this)->update([ 'archived_at' => now(), ]); } } لنفترض الآن أن التطبيق يريد مسح وأرشفة الخوادم التي كانت غير نشطة لفترة طويلة. سيكون الأمر: class ArchiveInactiveServers extends Command { protected $signature = 'archive-inactive-servers'; public function handle() { Server::inactiveForALongTime() ->get() ->each(function ($server) { $server->markAsArchived(); $server->owner->notify(new ServerArchivedNotification($server)); }); } } بصراحة ، من وجهة نظري ، لا يزال من الجيد ترك الأمر على النحو الوارد أعلاه. الآن ، ينمو العمل ، ولأسباب معينة ، يحتاج التطبيق إلى القيام بأمرين للتحضير والانتهاء قبل / بعد وضع علامة على الخادم على أنه مؤرشف. $server->prepareToArchieve(); $server->markAsArchived(); $server->doSomethingToFinalise(); $server->owner->notify(new ServerArchivedNotification($server)); الآن مع كل تحديث قادم ، تحتاج إلى تكراره مرتين: في وحدة التحكم والأمر. إنه ليس إلزاميًا ولكن يمكن اعتبار استخراج منطق الأعمال. لننقل المنطق إلى فئة مخصصة تسمى ArchiveServer: namespace App\Actions; use App\Models\Server; use App\Notifications\ServerArchivedNotification; class ArchiveServer { public function archive(Server $server) { $server->prepareToArchieve(); $server->markAsArchived(); $server->doSomethingToFinalise(); $server->owner->notify(new ServerArchivedNotification($server)); } } نحن نطلق على هذه الفئات مثل هذه "الإجراءات". الإجراء عبارة عن فئة بسيطة ذات طريقة عامة واحدة فقط تتعامل مع منطق الأعمال. يمكنك تسميته كما تريد: فعل الإجراء ، أو التعامل ، أو حتى __invoke لاستدعائه مباشرة كدالة. ذلك يعتمد على ذوقك. يمكنك الآن تنفيذ الإجراء عبر مساعد التطبيق: class ArchivedServersController extends Controller { public function store(Server $server) { $this->authorize('update', $server); app(ArchieveServer::class)->archive($server); return $server; } } class ArchiveInactiveServers extends Command { protected $signature = 'archive-inactive-servers'; public function handle() { Server::inactiveForALongTime() ->get() ->each(fn ($server) => app(ArchieveServer::class)->archive($server)); } } 2- The Repository pattern المستودعات هي فئات أو مكونات تغلف المنطق المطلوب للوصول إلى مصادر البيانات. إنها تركز وظائف الوصول إلى البيانات المشتركة ، وتوفر إمكانية صيانة أفضل وفصل البنية التحتية أو التكنولوجيا المستخدمة للوصول إلى قواعد البيانات من طبقة نموذج المجال. إذا كنت تستخدم مخطط ربط الكائنات (ORM) مثل Laravel or django Framework ، فإن الكود الذي يجب تنفيذه يكون مبسطًا ، وذلك بفضل LINQ والكتابة القوية. يتيح لك هذا التركيز على منطق استمرارية البيانات بدلاً من التركيز على سباكة الوصول إلى البيانات.
-
لقد وجدت ما يلي يعمل مع windows: قم بتشغيل python للتحقق مما إذا كانت python 32 أو 64 بت. قم بتثبيت OSGeo4W التالي (32 أو 64 بت) في C: \ OSGeo4W أو C: \ OSGeo4W64: ملاحظة: حدد تثبيت Express Web-GIS وانقر فوق التالي. في قائمة ‘Select Packages’ ، تأكد من تحديد GDAL ؛ يتم أيضًا تمكين MapServer و Apache افتراضيًا ، وقد يتم إلغاء تحديدهما بأمان. تأكد من تضمين ما يلي في settings.py: import os if os.name == 'nt': import platform OSGEO4W = r"C:\OSGeo4W" if '64' in platform.architecture()[0]: OSGEO4W += "64" assert os.path.isdir(OSGEO4W), "Directory does not exist: " + OSGEO4W os.environ['OSGEO4W_ROOT'] = OSGEO4W os.environ['GDAL_DATA'] = OSGEO4W + r"\share\gdal" os.environ['PROJ_LIB'] = OSGEO4W + r"\share\proj" os.environ['PATH'] = OSGEO4W + r"\bin;" + os.environ['PATH']
- 8 اجابة
-
- 1
-
1. تثبيت تطبيق DJANGO-PAYPAL pip install django-paypal 2. أدخل التطبيق في إعدادات DJANGO الخاصة بك INSTALLED_APPS = ( ... 'paypal.standard.ipn', ) 3. أدخل نموذج PayPal عند العرض from django.views.generic import FormView from django.urls import reverse from paypal.standard.forms import PayPalPaymentsForm class PaypalFormView(FormView): template_name = 'paypal_form.html' form_class = PayPalPaymentsForm def get_initial(self): return { "business": 'your-paypal-business-address@example.com', "amount": 20, "currency_code": "EUR", "item_name": 'Example item, "invoice": 1234, "notify_url": self.request.build_absolute_uri(reverse('paypal-ipn')), "return_url": self.request.build_absolute_uri(reverse('paypal-return')), "cancel_return": self.request.build_absolute_uri(reverse('paypal-cancel')), "lc": 'EN', "no_shipping": '1', } هذا FormView عادي والقالب paypal_form.html هو نموذج Django قياسي مثل هذا: <html> <body> {{ form.render }} </body> </html> 4. تقديم عنوان URL لـ PAYPAL IPN path('paypal/', include('paypal.standard.ipn.urls')), 5. إنشاء صفحات للنجاح وفشل الدفع باي بال #views.py from django.views.generic import TemplateView class PaypalReturnView(TemplateView): template_name = 'paypal_success.html' class PaypalCancelView(TemplateView): template_name = 'paypal_cancel.html' # URL.py from . import views urlpatterns = [ path('/paypal-return/', views.PaypalReturnView.as_view(), name='paypal-return'), path('/paypal-cancel/', views.PaypalCancelView.as_view(), name='paypal-cancel'), ... ] 6. قم بإعداد الدالة التالية لاستلام مدفوعات PAYPAL الناجحة from paypal.standard.models import ST_PP_COMPLETED from paypal.standard.ipn.signals import valid_ipn_received @receiver(valid_ipn_received) def paypal_payment_received(sender, **kwargs): ipn_obj = sender if ipn_obj.payment_status == ST_PP_COMPLETED: # تحذير ! # تأكد من أن البريد الإلكتروني للمستلم هو نفسه الذي قمنا بتعيينه مسبقًا في حقل "الأعمال". (يمكن للمستخدم العبث بـ # تلك الحقول في نموذج الدفع قبل أن ينتقل إلى PayPal) if ipn_obj.receiver_email != 'your-paypal-business-address@example.com': # دفع غير صالح return # أيضًا: لنفس السبب ، تحتاج إلى التحقق من المبلغ # تلقى ، "العرف" وما إلى ذلك هي كل ما تتوقعه أو ماذا # مسموح به. try: my_pk = ipn_obj.invoice mytransaction = MyTransaction.objects.get(pk=my_pk) assert ipn_obj.mc_gross == mytransaction.amount and ipn_obj.mc_currency == 'EUR' except Exception: logger.exception('Paypal ipn_obj data not valid!') else: mytransaction.paid = True mytransaction.save() else: logger.debug('Paypal payment status not completed: %s' % ipn_obj.payment_status)
- 1 جواب
-
- 1
-
تعد النماذج المنبثقة طريقة رائعة لإجراء حوارات على موقع الويب الخاص بك. يمكنك إنشاء نماذج تسجيل دخول منبثقة أو نماذج اتصال أو أي نوع آخر من النماذج لموقعك. سيكون الزر المنبثق تحت أعين الزائر مباشرة. عندما ينقر المستخدم على الزر المنبثق ، سيظهر النموذج على الشاشة. هنا يمكنك معرفة كيفية إنشاء نموذج منبثق باستخدام JavaScript. استخدم display = "block" لـ openForm () و display = "none" لوظائف closeForm () لإظهار وإغلاق النموذج عند النقر فوقه: function openTheForm() { document.getElementById("popupForm").style.display = "block"; } function closeTheForm() { document.getElementById("popupForm").style.display = "none"; } مثال على نموذج منبثق باستخدام JavaScript: <!DOCTYPE html> <html> <head> <title>نافذة منبثقة</title> <style> * { box-sizing: border-box; } .openBtn { display: flex; justify-content: left; } .openButton { border: none; border-radius: 5px; background-color: #1c87c9; color: white; padding: 14px 20px; cursor: pointer; position: fixed; } .loginPopup { position: relative; text-align: center; width: 100%; } .formPopup { display: none; position: fixed; left: 45%; top: 5%; transform: translate(-50%, 5%); border: 3px solid #999999; z-index: 9; } .formContainer { max-width: 300px; padding: 20px; background-color: #fff; } .formContainer input[type=text], .formContainer input[type=password] { width: 100%; padding: 15px; margin: 5px 0 20px 0; border: none; background: #eee; } .formContainer input[type=text]:focus, .formContainer input[type=password]:focus { background-color: #ddd; outline: none; } .formContainer .btn { padding: 12px 20px; border: none; background-color: #8ebf42; color: #fff; cursor: pointer; width: 100%; margin-bottom: 15px; opacity: 0.8; } .formContainer .cancel { background-color: #cc0000; } .formContainer .btn:hover, .openButton:hover { opacity: 1; } </style> </head> <body> <h2>نموذج تسجيل دخول</h2> <p>انقر فوق الزر "فتح النموذج" لفتح النموذج المنبثق.</p> <div class="openBtn"> <button class="openButton" onclick="openForm()"><strong>Open Form</strong></button> </div> <div class="loginPopup"> <div class="formPopup" id="popupForm"> <form action="/action_page.php" class="formContainer"> <h2>الرجاء تسجيل الدخول</h2> <label for="email"> <strong>البريد</strong> </label> <input type="text" id="email" placeholder="Your Email" name="email" required> <label for="psw"> <strong>كلمة السر</strong> </label> <input type="password" id="psw" placeholder="Your Password" name="psw" required> <button type="submit" class="btn">دخول</button> <button type="button" class="btn cancel" onclick="closeForm()">إلغاء</button> </form> </div> </div> <script> function openForm() { document.getElementById("popupForm").style.display = "block"; } function closeForm() { document.getElementById("popupForm").style.display = "none"; } </script> </body> </html>
-
طالما أن موقعك لا يحتوي على قاعدة بيانات فهذا قد لا يحتاج إلى حماية ، ﻷن الأصل هو حماية البيانات من الهجوم ووضع خطط لمثل هذه الحالات مثل backup وغيرها . فقط يمكنك رفع موقعك في استضافة githup الأشهر في مثل هذه المواقع وتربطها بالنطاق الخاص بك ، ﻷن خوادم شركة github التابعة ل microsoft مؤمنة وسريعة . أما إذا أصريت على حجز استضافة مدفوعة فهذه أبرز الخطوات لحماية موقعك اختر مزود استضافة أكثر أمانًا استعمال المصادقة الثنائية عند التسجيل في حسابك على احد مزودي خدمة الإستضافة إجعل كلمة السر قوية استخدم حماية DDoS فعل جدار الحماية السحابي Cloud Firewall
- 3 اجابة
-
- 1
-
في هذا المثال ، نتلاشى في صورة عند التمرير بإضافة فئة fadeIn إليها عندما تدخل منفذ العرض. هذا هو js: const img = document.querySelector("img") const callback = (entries, observer) => { entries.forEach((entry) => { if (entry.isIntersecting) { entry.target.classList.add("fadeIn") } }) } const options = {} const myObserver = new IntersectionObserver(callback, options) myObserver.observe(img) إنشاء مراقب التقاطع intersection observer أولاً ، نقوم بإنشاء مراقب تقاطع عن طريق استدعاء المُنشئ الخاص به وتمريره وظيفة callback وكائن خيارات اختياري. الخيارات كائن له 3 خصائص: const options = { root: null, rootMargin: '0px', threshold: 0 } root : افتراضي فارغ. إنه منفذ العرض. يمكن أن يكون المستند أو عنصر HTML. إذا كان الجذر فارغًا ، يتم تعيين المستند افتراضيًا. rootMargin: الافتراضي 0 بكسل. يحدد إزاحات كل جانب من المربع المحيط بالجذر. بمعنى آخر ، تقلل القيم الموجبة من المربع المحيط بالجذر وتزيده القيم السالبة. حاول تمرير المربعات الثلاثة في هذا المثال. callback const callback = (entries, observer) => { entries.forEach(entry => { // يصف كل إدخال تغييرًا في التقاطع لواحد تمت ملاحظته // العنصر الهدف: // entry.boundingClientRect // entry.intersectionRatio // entry.intersectionRect // entry.isIntersecting // entry.rootBounds // entry.target // entry.time }); }; لقد استخدمتهما في تحريك fadeIn: const callback = (entries, observer) => { entries.forEach((entry) => { if (entry.isIntersecting) { entry.target.classList.add("fadeIn") } }) } لتحديد عنصر مراد مراقبته ، نستخدم دالة observe() الخاصة بمراقب التقاطع. إذا كنت تريد ملاحظة العديد من العناصر ، فعليك إضافتها واحدة تلو الأخرى. myObserver.observe(img1) myObserver.observe(img2) myObserver.observe(img3) //----- أو const imgList = document.querySelectorAll(".imgToAnimate") imgList.forEach(img => { myObserver.observe(img) }) ﻹيقافها myObserver.unobserve(img) // ----- أو const callback = (entries, observer) => { entries.forEach((entry) => { if (entry.isIntersecting) { entry.target.classList.add("fadeIn") observer.unobserve(entry.target) // دالة إيقاف } }) } وهذا مثال <!------------------HTML---------------> <div class="container"> <div class="wrapper"> <img class="imgA" src="https://ljc-dev.github.io/hosted-assets/thumb-a.png" alt="avatar a"> </div> <div class="wrapper"> <img class="imgB" src="https://ljc-dev.github.io/hosted-assets/thumb-b.png" alt="avatar b"> </div> <div class="wrapper"> <img class="imgC" src="https://ljc-dev.github.io/hosted-assets/thumb-c.png" alt="avatar c"> </div> <div class="wrapper"> <img class="imgD" src="https://ljc-dev.github.io/hosted-assets/thumb-d.png" alt="avatar d"> </div> </div> * { margin: 0; padding: 0; box-sizing: border-box; } html, body { width: 100%; } html { scroll-behavior: smooth; } .container { width: 100%; height: 100vh; overflow-x: hidden; overflow-y: auto; padding-top: 12rem; } .wrapper { position: relative; margin: 5rem auto; width: 400px; height: 400px; } img { position: absolute; top: 0; left: 0; height: 400px; opacity: 0; width: 400px; transition: all 1s; } .imgA { transform: translateX(-200px); opacity: 0; } .imgB { transform: translateX(200px); opacity: 0; } .imgC { transform: translateY(200px); opacity: 0; } .imgD { transform: scale(0); } .fadeInLeft { transform: translateX(0px); opacity: 1; } .fadeInRight { transform: translateX(0px); opacity: 1; } .fadeInBtm { transform: translateY(0px); opacity: 1; } .zoomIn { transform: scale(1); opacity: 1; } const container = document.querySelector(".container") const wrappers = document.querySelectorAll(".wrapper") const imgs = document.querySelectorAll("img") const animClasses = [ "fadeInLeft", "fadeInRight", "fadeInBtm", "zoomIn", ] const observer = new IntersectionObserver((entries, observer) => { entries.forEach(entry => { const currentIndex = Array.from(wrappers).indexOf(entry.target) if (entry.isIntersecting) { imgs[currentIndex].classList.add(animClasses[currentIndex]) } else { if (entry.boundingClientRect.y > 0) { imgs[currentIndex].classList.remove(animClasses[currentIndex]) } } }) }, { root: container, threshold: 0.1, }) wrappers.forEach(wrapper => { observer.observe(wrapper) })
- 1 جواب
-
- 1
-
@Zeina Makdisiالخطأ معناه أنه لم يتم التعرف على المتغير user مما يعني أن الشرط لم يتحقق ، وهذا كما أشار أخي @Kais Hasanفي الإجابة السابقة أن العبارة login(request,user) يجب أن تكون داخل الشرط if form.is_valid
- 2 اجابة
-
- 2
-
سايثون (Cython) هي اللغة الإفتراضية التي يتم من خلالها إنشاء إمتدادات بلغة السي (C) للغة البرمجة بايثون . حيث أنها لغة شبيهة جداً بلغة بايثون نفسها وتساهم بشكل قياسي في تسريع أداء هذه الأخيرة . سي بايثون (CPython) هو التطبيق المصدري للغة بايثون ، والذي تمت كتابته باستخدام لغة السي - وكما هو معروف فإن لغة بايثون تمت كتابتها باستخدام لغة السي . مثال عن كود سايثون و سي بايثون
- 2 اجابة
-
- 1