لوحة المتصدرين
المحتوى الأكثر حصولًا على سمعة جيدة
المحتوى الأعلى تقييمًا في 01/25/22 في كل الموقع
-
لا شكر على واجب أخي. سؤال مهم متى نستمع هذه الخواص أظن أن الأمر يحتاج إلى أمثلة لتوضيح إستعمالات كل خاصية: ال 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 نقاط
-
أحاول أن أقوم بكتابة وحدة إختبار Unit Test للتأكد من حذف كائن object لذلك قمت بكتابة الكود التالي: 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>')) لكن المشكلة هي ظهور الخطأ التالي بإستمرار: DoesNotExist: Answer matching query does not exist. ما هو الخطأ هنا وكيف أقوم بحله؟1 نقطة
-
السلام عليكم هل من الممكن ان يتشرف احد الاخوة ويشرح لي الخاصية weakset بشكل مبسط وسهل الفهم وكدلك ما هو الفرق بينها وبين الخاصية weakMap جزاكم الله خيرا.1 نقطة
-
السلام عليكم ورحمة الله وبركاته انا اتقنت الflexbox و gird system الى درجه انني ارا ان الflexbox اسهل من bootstrap بالنسبه لي فهل يمككني الاستغناء عن الbootstrap من ناحية تخطيط الموقع فقط ولكن طبعا بالامور الاخرا بوتستراب افضل بمراحل من ان اعتمد على CSS فقط1 نقطة
-
بوتستراب يستخدم في نظامه الشبكي أو ما يعرف بgird system الخاصية flex بالفعل, فكما تلاحظ نستخدم الصنف row كحاوية للعناصر التي تمتلك الأصناف col , وأيضا يعتبر الصنف row صندوق مرن أي flexbox, لاحظ تنسيقاته .row { display: -ms-flexbox; display: flex; ^^^^^^^^^^^^^^ -ms-flex-wrap: wrap; flex-wrap: wrap; margin-right: -15px; margin-left: -15px; } كما تلاحظ نستخدم الخاصية display وقيمتها flex, من الممتاز اتقانك للصندوق المرن -flexbox- سوف تسهل عليك الكثير في بعض الأحيان , ولكن بوتستراب بالفعل تستخدم الخاصية flex لذلك من الأفضل ان تستخدم بوتستراب لأنه سوف يوفر عليك الوقت والجهد , فالكود الذي سوف تكتبه لتوزيع العناصر باستخدام css في 20 سطر سوف يستغرق منك كتابة اسم صنف واحد فقط , وأيضا اهمية بوتستراب لا تكمن فقط في النظام الشبكي او ما يعرف ب gird system, بل هناك العديد من الاصناف الأخرى والمكونات التي توفر عليك الكثير من الوقت في بنائها مثل مكون card و navbar والسلايدر وغيرها , لذلك لا أنصح بالاستغناء عن بوتستراب خاصة أنه مطلوب في سوق العمل ويتم طلبه بالاسم ليتم العمل به شكرا لك1 نقطة
-
قبل محاولة فهم الأطقم والخرائط ضعيفة الإشارة weakSet و weakMap يجب أولا فهم ما هي الخرائط Maps والأطقم Sets من الأساس. لنقم بتناول كل منهما كالتالي: يمكن فهم الأطقم Sets على أنها تجميعات من القيم الفريدة من أي نوع بيانات (سلسلة نصية، مصفوفة .. الخ). بمعنى أن كل عنصر في هاته التجميعة لا يمكن أن يتكرر ضمن نفس المجموعة. إستعمالات شائعة: // إنشاء طقم const letters = new Set(["أ","ب","ت"]); // إضافة قيمة جديدة للطقم letters.add("ج"); // حذف قيمة من الطقم letters.delete("ج"); // التحقق ما كان الطقم يمتلك قيمة ما letters.has("ج"); // حذف كامل القيم من الطقم letters.clear(); يمكن فهم الخرائط Maps على أنها تجميعات من القيم معرفة في أزواج مفتاح-قيمة / key-value حيث يمكن أن تكون هاته المفاتيح أي نوع بيانات. // إنشاء خريطة const platforms = new Map([ ["Mostaql", 500], ["Hsoub.io", 300], ["Orange", 200] ]); // إضافة قيمة جديدة للخريطة platforms.set("Khamsat", 300); // جلب قيمة من الخريطة عن طريق مفتاحها platforms.get("Khamsat"); و الأطقم والخرائط ضعيفة الإشارة تختلف عنها من حيث أنها: تقبل تخزين كائنات فقط، لا يمكن تخزين أنواع أولية فيها. let visitedSet = new WeakSet(); let john = { name: "John" }; visitedSet.add(john); // مسموح visitedSet.add('5'); // غير مسموح تمتلك الأطقم والخرائط ضعيفة الإشارة توابع محدودة وأقل من الأطقم والخرائط العادية. توابع مثل keys أو values لن تكون متوفرة. ما الغرض وراء استعمالها؟ تستعمل أساسا لتخزين البيانات الإضافية المتعلقة بكائن ما. حيث يتم تعيين هذا الكائن كفمتاح لمجموعة البيانات الإضافية الخاصة به. وبالتالي، لو قمنا بمسح هذا الكائن من الذاكرة فستختفي هاته البيانات أيضا. ولنقل كمثال، يريد الطالب Jhon تخزين ملف سري يخصه، بشرط أن خروج هذا الطالب سيعني مسح هذا الملف السري. نقوم بذلك كالتالي: weakMap.set(john, "secret documents"); أي فقدان للكائن john في التطبيق، سيؤدي إلى مسح القيمة المسندة إليه كمفتاح في الخارطة ضعيفة الإشارة. يمكنك الإستزادة بالتعرف عليهما في النوع WeakMap والنوع WeakSet: الخرائط والأطقم ضعيفة الإشارة في جافاسكربت.1 نقطة
-
ال 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 نقطة
-
أخطاء null safety ليس لها علاقة بالحزمة أو المكتبة التي تستخدمها، بل تتعلق بلغة Dart نفسها. ولذلك يجب عليك فهم آلية عملها لتستطيع استخدامها في الشيفرة البرمجية لديك وتجنب هذه الأخطاء مع المكتبات الخارجية. Null Safety أو اختصاراً NNBD هي آلية تعتمدها Dart بدءً من الإصدار الثاني ويقوم بها المترجم للتأكد من صحة نمط المتغيّرات أثناء كتابة الكود البرمجي لتجنّب الأخطاء مستقبلاً أثناء التشغيل أو runtime مما يسمح بكتابة شيفرة برمجية عالية الأداء وخالية من الأخطاء. باختصار إن وضع الأمان في null safety يعني أن المتغيرات لا يمكن أن تحتوي على قيم فارغة، ففي حال أراد المطوّر تعريف متغيّر على أنه قيمة فارغة أو null، يجب عليه ذكر ذلك صراحةً أثناء تعريف هذا المتغيّر. فعلى سبيل المثال، بمجرّد تعريف نمط لمتغيّر على أنه int، أي سيحوي حصراً قيمة عددية من نمط int ولا يمكن أن تكون هذه القيمة (null): void main() { int marks; marks = null; //سيسبب بظهور رسالة خطأ أثناء الترجمة } وهنا ستظهر لك رسالة الخطأ نفسها الظاهرة في الصورة، وهي أنه لا يمكن للمتغيّر marks أن يحوي القيمة null لأنه من نمط int. في حال أردنا إضافة القيمة null إلى هذا المتغيّر أثناء التعريف يجب استخدام الإشارة ? فيصبح من النمط int? int? marks = 36; // تتيح الإشارة إمكانية اسناد القيمة الفارغة لهذا المتغيّر marks = null; وهنا سيتم اسناد القيمة null إلى هذا المتغيّر دون حدوث خطأ أثناء الترجمة. وأيضاً في حالتك وعند وجود خصائص فرعية يمكنك إضافة العلامة ? إلى هذه الخصائص: final value = person?.address?.street?.value; وبنفس الطريقة أثناء استخدام هذا المتغيّر فيما بعد ضمن الشيفرة البرمجية، في حال كان يقبل القيمة null، يجب عليك إحاطة أماكن استخدام هذا المتغيّر بجمل شرطية، مثل شرط if: if(marks != null){ .... } وإلا ستظهر لك الرسالة الظاهرة في الصورة: "The property audio can't be unconditionally accessed" والتي تعني أنه لا يمكنك استخدام متغيّر ما بشكل مباشر ضمن الشيفرة البرمجية لأنه يقبل القيمة null، وبالتالي يجب عليك استخدام شرط ما للتحقق من أنه لا يساوي null. ويمكنك قراءة المزيد من المعلومات والأمثلة من قسم Null Safety في التوثيق الرسمي لـ Dart.1 نقطة
-
انا لا عارف ان كان هذا كود سويفت ام اوبجكتيف سى .. لاننى مطور ريأكت ناتيف وليس ios وهذه اول مرة اتعامل مع ios هذا هو الكود مع وضع ما قلت عليه لكن للأسف التطبيق لا يعمل #import "AppDelegate.h" #import <React/RCTBridge.h> #import <React/RCTBundleURLProvider.h> #import <React/RCTRootView.h> #import <TwitterKit/TWTRKit.h> #import "RNBootSplash.h" #ifdef FB_SONARKIT_ENABLED #import <FlipperKit/FlipperClient.h> #import <FlipperKitLayoutPlugin/FlipperKitLayoutPlugin.h> #import <FlipperKitUserDefaultsPlugin/FKUserDefaultsPlugin.h> #import <FlipperKitNetworkPlugin/FlipperKitNetworkPlugin.h> #import <SKIOSNetworkPlugin/SKIOSNetworkAdapter.h> #import <FlipperKitReactPlugin/FlipperKitReactPlugin.h> #import <Firebase.h> static void InitializeFlipper(UIApplication *application) { FlipperClient *client = [FlipperClient sharedClient]; SKDescriptorMapper *layoutDescriptorMapper = [[SKDescriptorMapper alloc] initWithDefaults]; [client addPlugin:[[FlipperKitLayoutPlugin alloc] initWithRootNode:application withDescriptorMapper:layoutDescriptorMapper]]; [client addPlugin:[[FKUserDefaultsPlugin alloc] initWithSuiteName:nil]]; [client addPlugin:[FlipperKitReactPlugin new]]; [client addPlugin:[[FlipperKitNetworkPlugin alloc] initWithNetworkAdapter:[SKIOSNetworkAdapter new]]]; [client start]; } #endif @implementation AppDelegate - (BOOL)application:(UIApplication *)app openURL:(NSURL *)url options:(NSDictionary<NSString *,id> *)options { return [[Twitter sharedInstance] application:app openURL:url options:options]; } - (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions { [FIRApp configure]; #ifdef FB_SONARKIT_ENABLED InitializeFlipper(application); #endif private func setKeyWindowFromAppDelegate(makeRTL: Bool) { UIView.appearance().semanticContentAttribute = makeRTL ? .forceRightToLeft : .forceLeftToRight let appDelegate = UIApplication.shared.connectedScenes.first?.delegate as? SceneDelegate let homeController = UIViewController() appDelegate?.window?.rootViewController = homeController } setKeyWindowFromAppDelegate(makeRTL: true) RCTBridge *bridge = [[RCTBridge alloc] initWithDelegate:self launchOptions:launchOptions]; RCTRootView *rootView = [[RCTRootView alloc] initWithBridge:bridge moduleName:@"MyApp" initialProperties:nil]; if (@available(iOS 13.0, *)) { rootView.backgroundColor = [UIColor systemBackgroundColor]; } else { rootView.backgroundColor = [UIColor whiteColor]; } self.window = [[UIWindow alloc] initWithFrame:[UIScreen mainScreen].bounds]; UIViewController *rootViewController = [UIViewController new]; rootViewController.view = rootView; self.window.rootViewController = rootViewController; [self.window makeKeyAndVisible]; [RNBootSplash initWithStoryboard:@"BootSplash" rootView:rootView]; return YES; } - (NSURL *)sourceURLForBridge:(RCTBridge *)bridge { #if DEBUG return [[RCTBundleURLProvider sharedSettings] jsBundleURLForBundleRoot:@"index" fallbackResource:nil]; #else return [[NSBundle mainBundle] URLForResource:@"main" withExtension:@"jsbundle"]; #endif } @end هذا هو الكود رجاء اخبرنى ان كان سويفت ام اوبجكتيف سى @Mohamd Imran1 نقطة
-
الصور تستهلك الكثير من الذاكرة ,وبوضعها داخل قاعدة البيانات سيتسبب هذا بمرور الوقت في ضرورة تكبير الحيز المتاح لقاعدة البيانات هذا أولاً, ثانياً سيتسبب هذا في تأخر طلبات الإستعلام من وإلي قاعدة البيانات, ثالثا كبر حجم الاستعلام نفسه فعلي سبيل المثال إذا كان المستخدم سيطلب عرض Slides يحتوي علي عدة صور وليكن أربعة صور كل صورة منهم حجمها يفوق 500 كيلوبايت ,مما يعني 2 ميغابايت حجم الصور الإجمالي أو أكثر , عوضاً عن باقي البيانات , في هذا الوضع تخيل أن سرعة الانترنت لدي مستخدمين هذا الموقع أقل من 100 كيلوبايت في الثانية الواحدة أو لنفرض 100, وهذا يعني أن زمن تنفيذ واستلام هذا الطلب يترواح بين 15 إلى 25 ثانية ,في حين أنك قد تكون مضطراً إلى ضبط إعدادات موقعك والسيرفر الذي يديره علي زمن انتظار أو timeOut أقل من هذا الحيز بكثير , مما عني في نهاية الأمر فشل الطلب وظهور رسالة Error time out للمستخدمين الذين يمتلكون سرعة اتصال بالانترنت أقل من 500 كيلوبايت , لا أخفي عليك القول أنني في هذه اللحظة لا يمكنني الدخول إلى موقعك هذا لأنني أمتلك سرعة اتصال أقل من جيدة. غير ذلك كبر حجم الطلبات المرسلة يستغرق الكثير من الموارد المخصصة لموقعك او تطبيقك, البديل لتلك الطريقة هو حفظ اسماء الصور فقط في قاعدة البيانات , بينما يتم حفظ الصور في مكان أخر أو ربما سيرفر أخر تماما وهذا ما يقوم به العديد من المواقع ,فمثلا يمكنك إنشاء موقعك علي أي استضافة ثم حفظ الصور او الملفات علي اسضافة أخري أقل تكلفة وأفضل ك Amazon S3 , وهنا حاول تخيل وضع المستخدم الذي يحاول تحميل موقع به العديد من الصور بالإضافة إلى Slides الموجود في رأس الصفحة الرئيسية, فمع حفظ جميع الصور في قاعدة البيانات مضغوطة بbase64 سيصبح من الصعب الوصول لموقعك. ولكن في حال وجود الصور بعيداً عن قاعدة البيانات سيكون تحميل كل صورة فقط عندما يحاول المستخدم عرضها , كأن يتحرك داخل Slides ,أو يحاول عرض اجزاء من الصفحة تحوي صوراً إلى أخره. ولكن نعود إلى نقطة مهمة ذكرتها في سؤالك"وهي إن كنا نقوم بتحويلها إلى base64 قبل الإرسال!" فأولاً من الأفضل تشفير الصور إلى base64 داخل frontend أو حتي عدم تشفيرها فذلك ليس ضرورياً, وربما في حالات معينة مثل محاولة اخفاء الخادم الذي يتم الاحتفاظ بالصور بداخله, حتي مع هذا الإجراء فأنت تقلل الاعتماد علي قاعدة البيانات في أمور بعينها , ولكن يظل هناك جانب مرهق واقع علي الخادم أو علي الجزء المعني بتحويل الصور وإرسالها للمستخدم. وإن لم يكن الجانب الأمني في اعتبارك فأنصح بإرسال url او لينك الصور بدلا من تحويلها, وبالتأكيد هناك الكثير من الأسباب التقنية التي لم أتطرق إليها. بالتوفيق1 نقطة
-
بوجهٍ عام لا يُفضل تخزين الصور على هيئة تشفيل 64 بيت (base 64 encoding) وذلك لأن هذا النوع من التشفير يزيد من حجم الصورة بما يُقارب ال33% وبالتالي سيتم تخزين 33% زيادة في قاعدة البيانات وبالتالي ستُصبح عمليات القراءة والكتابة من قاعدة البيانات أبطأ مع العلم أن قاعدة البيانات في الغالب تخزن البيانات في القرص الصلب والذي هو بمثابة عنق الزجاجة في الحوسبة حيث أن عمليات القراءة والكتابة في القرص الصلب في غاية البطؤ مقارنةً بالذاكرة العشوائية لذلك من الأفضل تخزين البيانات في القرص الصلب بأقل مساحة ممكن والقيام بأي عمليات في الذاكرة العشوائية.1 نقطة
-
عادة Flask يبحث عن القوالب ( templates) في مستوى الجذر لتطبيقك في مجلد يسمى templates. لتغيير هذا المجلد أو إختيار مجلد آخر ما عليك فعله الا استعمال template_folder على الشكل التالي: app = Flask(__name__, template_folder='frontend') @app.route('/notifications') def notifications(): return render_template("view_notifications.html")#هنا عليك فقط وضع اسم القالب1 نقطة
-
لا تحتاج إلي كتابة المسار داخل render_template فقط يمكنك تغيير المسار الرئيسي من خلال template_folder , تابع التالي #main.py from flask import (Flask, render_template) app = Flask(__name__, template_folder='../frontend/template') @app.route('/notifications') def notifications(): return render_template("view_notifications.html") #إذا كان لديك مسارات فرعية فيمكنك إستخدامها بالشكل التالي @app.route('/page') def pages(): return render_template("post/page.html") وإذا كنت تشك في مسارك يمكنك كتابة المسار كاملاً بالشكل التالي app = Flask(__name__, template_folder=r'C:\Users\mohamed\project\frontend\template') لاتنسي حرف r مهم إذا كنت تستخدم نظام التشغيل ويندوز ومساره الكامل والذي يبدأ ب C:\Users أو D:\x وما شابه وإلا سيواجهك خطأ كهذا app = Flask(__name__, template_folder='C:\Users\mohamed\project\frontend\template') ^ SyntaxError: (unicode error) 'unicodeescape' codec can't decode bytes in position 2-3: truncated \UXXXXXXXX escape موفق1 نقطة
-
يمكن الحفظ بأكثر من طريقة مثلا من form.py او view.py أو models.py فيما يلي طريقتين للحفظ من خلال models.py def edit_path(instance, filename): """من الممكن ألا يعمل username ويكون البديل هو user""" users_media = 'users' #يرجي العلم بأن جميع المستخدمين سيتم إنشائهم بداخل هذا المسار الفرعي ويمكن استبداله return f'{users_media}/{instance.username}/{filename}' class Post(models.Model): title = models.CharField(max_length=200) user = models.ForeignKey(User) thumbnail = models.FileField(upload_to=edit_path) #يتم استبدال مسار الحفظ بالدالة أعلاه سيتم إنشاء مجلد أو مسار لكل مستخدم بداخل users وكل هذا بالطبع داخل المسار MEDIA_ROOT المعلن عنه في settings.py . 2: هو استخدام دالة save الموجودة في models ,تابع التالي from django.conf import settings from django.core.files.base import File import os class Post(models.Model): title = models.CharField(max_length=200) user = models.ForeignKey(User) thumbnail = models.FileField(upload_to='users/') def save(self, *args, **kwargs):#يتم تنفيذ هذه الدالة مباشرة عند إجراء حفظ بيانات جديدة لهذا الجدول if self.user: name = self.user.username #الحصول على أسم المستخدم #إنشاء مسار جديد لهذا المستخدم في مسار الوسائط new_directory = os.path.join(settings.MEDIA_ROOT, 'users', name) if not os.path.exists(new_directory): os.makedirs(new_directory) #قراءة الملف السابق with open(thumbnail.path) as f: #ثم حفظه في المسار الجديد وتسجيل التغيير في الحقل المنشود self.thumbnail.save(os.path.join(new_directory,thumbnail.filename), File(f)) return super(Post, self).save(*args, **kwargs) تعتبر الطريقة الأولي هي الأفضل ولكن الطريقة الثانية قد تكون مفيدة وأكثر مرونة في حالات عدة من بينها إستخدام إجراءات أكثر داخل الجدول Post من تغيير قيمة حقول أخري في نفس اللحظة, إلي أخره. موفقين1 نقطة
-
تطبيقات Django تكون موجودة في عدة أماكن تحتاج منك إلي حذفها يدوياً, مثلا urls.py الرئيسي وINSTALLED_APPS وغيرها من الأماكن, بالنسبة لقاعدة البيانات قد يختلف إزالة التطبيقات بين إصدارات Django الأحدث والأقدم فمثلا في الإصدارات الأقدم من 1.7 يمكننا استخدام python manage.py sqlclear myapp python manage.py migrate وبالنسبة للإصدارات الأحدث يكفي إزالة التطبيق من INSTALLED_APPS وتنفيذ python manage.py migrate ------------- هناك طرق أخرى مثلا يمكن حذف الجداول المتعلقة بهذا التطبيق قبل إزالة التطبيق نفسه python manage.py makemigrations -n drop_all_tables myapp ثم إزالته بأمان من INSTALLED_APPS ,والمجلد الخاص به. ولكن يجب الانتباه جيداً فربما تكون تلك الجداول مستخدمه في تطبيقات أخري ,أو قد تكون هناك وظائف من التطبيق الحالي مستخدمة في باقي التطبيقات.1 نقطة
-
1 نقطة