-
المساهمات
646 -
تاريخ الانضمام
-
تاريخ آخر زيارة
-
عدد الأيام التي تصدر بها
1
إجابات الأسئلة
-
إجابة مسعود زاهي سؤال في كيفية إستخراج النص من عنصر HTML في جانغو Django؟ كانت الإجابة المقبولة
لاستخراج النص من عنصر HTML في جانغو يُمكنك إستعمال الدالة strip_tags التي تقوم بنزع كل الوسوم الخاصة ب HTML من النص.
from django.utils.html import strip_tags # نقوم باستدعاء الدالة post_title = '<div>Some Content</div>' post_title = strip_tags(post_title) print(my_string) # النص المُخرج سوف يَكون # Some Content كما يُمكنك إستخدام المُرشح striptags في القوالب لنزع وسوم ال HTML من المُتغيرات على الشكل التالي:
{{ post_title|striptags }}
-
إجابة مسعود زاهي سؤال في كيفية تعين حد limit لحجم الملفات التي يتم رفعها على جانغو Django؟ كانت الإجابة المقبولة
لتعيين حد لحجم الملفات التي يتم رفعها في جانغو يُمكنك إضافة مُحقق (Validator) يقومُ بفحص حجم الملف قبل حفظه في النموذج.
from django.core.exceptions import ValidationError def validate_file_size(value): filesize= value.size if filesize > 2097152: #2mb raise ValidationError("The maximum file size that can be uploaded is 2MB") else: return value الدالة validate_file_size تقومُ بالتحقق من أن حجم الملف لا يتعدى 2mb (أي 2097152) بالبايت و إثارة إستثناء إذا كان كذلك.
لإضافتها كمُحقق نقوم بالتالي:
image = forms.FileField(upload_to='images/', validators=[validate_file_size])
-
إجابة مسعود زاهي سؤال في هل يمكن إستدعاء ملف عرض view من داخل ملف عرض آخر في جانغو Django؟ كانت الإجابة المقبولة
نعم يُمكنك إستدعاء دالة عرض (view) داخل دالة عرض أخرى. مثلاً:
#دالة العرض الأولى def view1(request): #الكود الذي تُريد إستدعاءه في دالة عرض أخرى return HttpResponse("some html here") #دالة العرض الثانية def view2(request): view1(request) # إستدعاء الدالة 1 return HttpResponse("some different html here") أو الأحسن أنك تعمل دالة بايثون تضع فيها الشفرة المشتركة بين دالتي العرض:
def common_function(): #أكتب هنا الكود المشترك بين الدالتين return #دالة العرض الأولى def view1(request) common_function()# قم باستدعاء الدالة المشتركة return HttpResponse("some html here") #دالة العرض الثانية def view2(request) common_function()# قم باستدعاء الدالة المشتركة return HttpResponse("some different html here")
-
إجابة مسعود زاهي سؤال في كيفية جعل متغير متاحًا في كل القوالب بشكل إفتراضي في جانغو Django؟ كانت الإجابة المقبولة
لجعل مُتغير متاحاً في كل القوالب بشكل إفتراضي يجب إنشاء مُعالج سياق (context processor) جديد وإضافته إلى إعدادات جانغو. لفِعل ذلك نقوم بإنشاء ملف بايثون داخل تطبيق جانغو ونقوم بتسميته my_context_processors.py.
داخل الملف نقوم بكتابة الشفرة التالية:
from myapp.models import Category def categories_processor(request): categories = Category.objects.all() return {'categories': categories} # أنشأنا متغير جديد فيه كل المُنتجات ثم نُضيف my_context_processors داخل ملف الإعدادات:
TEMPLATES = [ { 'BACKEND': 'django.template.backends.django.DjangoTemplates', 'OPTIONS': { 'loaders': [ ... ], 'context_processors': [ 'django.template.context_processors.debug', 'django.contrib.auth.context_processors.auth', 'django.contrib.messages.context_processors.messages', "myapp.my_context_processors.categories_processor" # نُضيفه هنا ], }, } ] بهذا الشكل يكون categories مًتواجداً في كل القوالب.
-
إجابة مسعود زاهي سؤال في كيفية إستيراد ملف CSV إلى نموذج model في جانغو Django؟ كانت الإجابة المقبولة
يُمكنك إنشاء أمر في جانغو يقوم بقراءة ملف ال CSV وإدخال المعلومات داخل النموذج Product.
لإنشاء الأمر نقوم بإنشاء مجلد داخل تطبيق جانغو ونقوم بتسميته management، داخل هذا المجلد نقوم بإنشاء مجلد آخر اسمه commands، وبداخله نقوم بإنشاء ملف بايثون يحمل الإسم insert_products_from_csv.py.
نقوم بوضع هذه الشفرة داخل الملف.
from django.core.management.base import BaseCommand import csv class Command(BaseCommand): help = 'إنشاء كائنات إنطلاقاً من ملف csv' def add_arguments(self, parser): parser.add_argument('--path', type=str, help="مسار الملف") def handle(self, *args, **options): # نجلب مسار الملف file_path = options['path'] # نقرأ الملف with open(file_path, 'rb') as csv_file: reader = csv.reader(csv_file, delimiter=';') for row in reader: # نستخرج معلومات المُنتج من كل سطر product_id = row[0] product_name = row[1] product_price = row[2] product_description = row[3] # نحفظ المعلومات في النموذج person, created = Person.objects.update_or_create( id=product_id, name=product_name, price=product_price, description=product_description ) لتشغيل الأمر نكتب
python manage.py insert_products_from_csv --path "هنا نضع مسار الملف كاملاً"
-
إجابة مسعود زاهي سؤال في خطأ Permission denied عند تشغيل مشروع فلاسك Flask؟ كانت الإجابة المقبولة
أنت تُحاول تشغيل تطبيق flask في المنفذ 81 الذي يُعتبر من المنافذ ذوات الإمتيازات (privileged port) . إستعمل منفذ آخر مثل 5000 لن يطلب منك النظام إمتيازات المُدير لاستعماله.
app.run(host="127.0.0.1", port=5000, debug=True) ملاحظة: المنافذ ذوات الإمتيازات هي المنافذ الأقل من 1024 وهي منافذ لا يُسمح للمستخدمين العاديين تشغيل الخوادم عليها - هذا إجراء أمني -.
-
إجابة مسعود زاهي سؤال في كيف أقوم بتحدي مكان ملفات logs في جانغو Django؟ كانت الإجابة المقبولة
إعدادات جانغُو الإفتراضية لا تعمل على إنشاء ملفات logs. وإنما فقط تقوم بإرسال رسالة إلكترونية إلى مُديري المشروع المُتواجدة عناوينهم الإلكترونية في القائمة ADMINS (في ملف الإعدادات settings.py) في حالة الخطأ رقم 500. إذا أردت إضافة هذا الأمر وحفظ الأخطاء داخل ملفات logs عليك بتغيير القيمة الإفتراضية ل LOGGING في ملف الإعدادات على الشكل التالي:
# هذه هي الإعدادات الإفتراضية لجانغو LOGGING = { 'version': 1, 'disable_existing_loggers': False, 'filters': { 'require_debug_false': { '()': 'django.utils.log.RequireDebugFalse', }, 'require_debug_true': { '()': 'django.utils.log.RequireDebugTrue', }, }, 'formatters': { 'django.server': { '()': 'django.utils.log.ServerFormatter', 'format': '[{server_time}] {message}', 'style': '{', } }, 'handlers': { 'console': { 'level': 'INFO', 'filters': ['require_debug_true'], 'class': 'logging.StreamHandler', }, 'django.server': { 'level': 'INFO', 'class': 'logging.StreamHandler', 'formatter': 'django.server', }, 'mail_admins': { 'level': 'ERROR', 'filters': ['require_debug_false'], 'class': 'django.utils.log.AdminEmailHandler' }, ## نقوم بإضافة 'applogfile': { 'level':'DEBUG', 'class':'logging.handlers.RotatingFileHandler', ## هنا نضع المسار الذي تريد حفظ الملفات فيه مع اسم الملف 'filename': os.path.join(BASE_DIR, 'mylog.log'), 'maxBytes': 1024*1024*15, # 15MB الحجم الأقصى للملف الواحد 'backupCount': 10, # العدد الأقصى للملفات }, }, 'loggers': { 'django': { 'handlers': ['console', 'mail_admins', 'applogfile'], #نُضيف الاسم إلى القائمة 'level': 'INFO', }, 'django.server': { 'handlers': ['django.server'], 'level': 'INFO', 'propagate': False, }, }, } ملفات ال logs سوف تُحفظ في المسار وبالاسم الذي حددته في الإعدادات.
-
إجابة مسعود زاهي سؤال في كيفية عمل pagination في فلاسك Flask؟ كانت الإجابة المقبولة
هذا مثال بسيط لفهم تقسيم الصفحات الخاص ب Flask-SQLAlchemy.
نفرض أنه يوجد لدينا صفحة نقوم بعرض مجموعة من الألوان بداخلها. أولاُ نقوم بجلب الألوان: @app.route('/colors') def colors(): # نجلب الألوان من قاعدة البيانات # ونعرضها في القالب colors = Color.query.all() return render_template('colors/all_colors.html', colors=colors)
ثانيا نعرض الألوان في القالب:
<div class="table-responsive"> <table class="table table-sm table-borderless mb-0"> <thead class="thead-dark"> <tr> <th>S/N</th> <th>Color Name</th> <th>Date Created</th> <th>Actions</th> </tr> </thead> <tbody> {% for color in colors %} <tr> <th scope="row">{{ loop.index }}</th> <td>{{ color.name }}</td> <td>{{ color.created_at }}</td> </tr> {% endfor %} </tbody> </table> </div> كل الألوان سيتم عرضُها. حتى ولو كان عددها كبيراً جداً وهذا سيؤدي إلى ثقل في تحميل الصفحة.
الحل طبعا هو إضافة ال pagination. لإضافتها نغير الشفرة إلى:
ROWS_PER_PAGE = 10 # نعين عدد الالوان التي نريدها في كل صفحة @app.route('/colors') def colors(): # نضغ إعدادات الترقيم page = request.args.get('page', 1, type=int) # نستعمل الدالة paginate # من Flask SQLAlchemy # ونمرر لها الصفحة الحالية مع عدد الألوان في كل صفحة colors = Color.query.paginate(page=page, per_page=ROWS_PER_PAGE) return render_template('colors/all_colors.html', colors=colors)
نقوم بتعديل القالب: لعرض العناصر يجب إستدعاء colors.items بدل colors.
<div class="table-responsive"> <table class="table table-sm table-borderless mb-0"> <thead class="thead-dark"> <tr> <th>S/N</th> <th>Color Name</th> <th>Date Created</th> <th>Actions</th> </tr> </thead> <tbody> {% for color in colors.items %} ^^^^^^^^^^^^ <tr> <th scope="row">{{ loop.index }}</th> <td>{{ color.name }}</td> <td>{{ color.created_at }}</td> </tr> {% endfor %} </tbody> </table> </div> <!-- إنشاء روابط تقسيم الصفحات --> <div class="text-right"> <a href="{{ url_for('colors', page=colors.prev_num) }}" class="btn btn-outline-dark {% if colors.page == 1 %}disabled{% endif %}"> « </a> <!-- نعمل حلقة لعمل رابط لكل صفحة --> {% for page_num in colors.iter_pages(left_edge=1, right_edge=1, left_current=1, right_current=2) %} {% if page_num %} <!-- نقوم بكتابة شرط للتحقق من الصفحة الحالية--> {% if colors.page == page_num %} <a href="{{ url_for('colors', page=page_num) }}" class="btn btn-dark"> {{ page_num }} </a> {% else %} <a href="{{ url_for('colors', page=page_num) }}" class="btn btn-outline-dark"> {{ page_num }} </a> {% endif %} {% else %} ... {% endif %} {% endfor %} <a href="{{ url_for('colors', page=colors.next_num) }}" class="btn btn-outline-dark {% if colors.page == colors.pages %}disabled{% endif %}"> » </a> </div> <p class="text-right mt-3"> Showing page {{ colors.page }} of {{ colors.pages }} </p>
-
إجابة مسعود زاهي سؤال في كيفية تحديد رمز الحالة status code عند إرسال كائن JSON في جانغو Django؟ كانت الإجابة المقبولة
في الحالة العادية JsonResponse تقوم بإرجاع رمز الحالة 200، إذا أردنا إرجاع رمز حالة آخر مثلاً في حالة الخطأ يُمكننا تعيين قيمة status في JsonResponse:
return JsonResponse({'status':'false','message':message}, status=500) ^^^^^^^^^^
-
إجابة مسعود زاهي سؤال في كيفية عرض كل المتغيرات المتوفر في قالب ما في جانغو Django؟ كانت الإجابة المقبولة
توجَدُ عدة خيارات يُمكنك إستخدامها وهذه الخيارات عادة ما تكونُ مُتوفرة في وضع التصحيح (Debug Mode). من بينها:
الخيار الأول: استخدام وسم القالب {% debug %} والذي يقوم بعرض كل معلومات وضع التصحيح المتوفرة ومن بينها المُتغيرات. الخيار الثاني: استخدام تطبيق جانغو Django debug toolbar. -
إجابة مسعود زاهي سؤال في كيفية الحصول على أحدث المنشورات بترتيب تصاعدي في جانغو Django؟ كانت الإجابة المقبولة
نعم هناك طريقة باستخدام order_by التي تسمح بترتيب المجموعة QuerySet الناتجة عن الفرز الذي قُمت به .
للترتيب من الأقدم إلى الأحدث نقوم ب:
qs = Article.objects.filter(since=since).order_by("id") أما من الأحدث إلى الأقدم نقوم ب:
qs = Article.objects.filter(since=since).order_by("-id") لجلب أحدث 10 منشورات نُضيف:
qs = Article.objects.filter(since=since).order_by("-id")[:10]
-
إجابة مسعود زاهي سؤال في كيفية الوصول إلى خاصية في أول عنصر في قائمة list في قوالب جانغو Django؟ كانت الإجابة المقبولة
يُمكنك إستخدام الطريقة هذه للوُصول إلى أول عُنصر من القائمة:
{{ users.0 }} هذه الطريقة تَسمحُ لك بالوصول إلى توابع وخواص الكائن مٌباشرة بالشكل التالي:
{{ users.0.fullName }} يُمكنك أيضا إستخدام الحلقة التكرارية forloop والتوقف عند أول عُنصر وطباعة خاصية من خواصه:
{% for user in users %} {% if forloop.first %} <!-- إطبع هنا الخاصية --> {{ user.fullName }} {% endif %} {% endfor %} أو يُمكنك إستخدام علامة القالب with :
{% with users|first as first_user %} {{ first_user.fullName }} {% endwith %}
-
إجابة مسعود زاهي سؤال في كيفية الحصول على اسم الملف فقط من الحقل FileField في جانغو Django؟ كانت الإجابة المقبولة
للحصول على اسم الملف فقط في بايثون يُمكنك استخدام الدالة basename من الوحدة os على الشكل التالي:
>> import os >> os.path.basename(file.name) لإستعمال هذه الدالة في القوالب يلزم إنشاء تابع أو خاصية في النموذج واستدعائه في القالب:
class MyModel(models.Model): file = models.FileField() ... #أنشأنا الخاصية filename @property def filename(self): return os.path.basename(self.file.name) بعدها نستخدمُه على الشكل التالي:
{% for uploaded in all_uploads %} <tr> <td>File Name: {{uploaded.filename}}</td><!-- لاحظ كيفية استعمال الخاصية --> <td>File Path: {{uploaded.file.name}}</td> <td>File Size: {{uploaded.file.size}}</td> </tr> {% endfor %}
-
إجابة مسعود زاهي سؤال في التحقق من أن الحقل OneToOneField يساوي None في جانغو Django؟ كانت الإجابة المقبولة
للتحقق مما إذا كانت العلاقة OneToOneField غير موجودة (تُساوي None) في جانغو يُمكنك إستخدام دالة بايثون hasattr:
if hasattr(request.user, 'category') or hasattr(request.user, 'subcategory'): # المُستخدم لديه # category # أو # subcategory else: # المستخدم لا يملك الخاصيتين يُمكنك تصفح موسوعة حسوب لمعرفة كيفية عمل هذه الدالة.
-
إجابة مسعود زاهي سؤال في كيف أحمي المفاتيح السرية Secret Keys في مرحلة الإنتاج Production؟ كانت الإجابة المقبولة
تُوجد عدة طُرق لإخفاء المفاتيح السرية Secret Keys في مرحلة الإنتاج Production من بينها:
إخفاء المفاتيح داخل متغيرات بيئة المُستخدم Environment Variables # في نظام لينكس لإخفاء المفاتيح السرية نستعمل export SECRET_KEY = 'اكتب المفتاح السري هنا' وبعدها إستدعاؤها من داخل الشيفرة. import os SECRET_KEY = os.environ['SECRET_KEY']
حفظ الأرقام السرية داخل ملف .env
# ملف .env SECRET_KEY = 'اكتب المفتاح السري هنا' بعدها يُمكن إستعمال مكتبة بايثون python-decouple لإسترجاعها:
from decouple import config SECRET_KEY = config('SECRET_KEY') ملاحظة: لتثبيت مكتبة python-decouple يُرجى كتابة الأمر
pip install django-generate-secret-key
إذا كُنت تستخدم جانغو فيُمكنك أيضا إنشاء مفتاح سري حال الإنتاج باستخدام تطبيق جانغو django-generate-secret-key الذي يسمح بإنشاء المفتاح باستخدام الأمر:
python manage.py generate_secret_key
-
إجابة مسعود زاهي سؤال في هل يمكن معرفة الموقع الذي أتى الزائر منه في فلاسك Flask؟ كانت الإجابة المقبولة
للحصول على الرابط الذي أتى منه العميل في flask يُمكنك إستخدام:
referrer = request.headers.get("Referer") أو باستخدام الإختصار:
referrer = request.referrer
-
إجابة مسعود زاهي سؤال في ما الفرق بين التابع get و إستخدام القاموس مباشرة في جانغو Django؟ كانت الإجابة المقبولة
request.POST هو عبارة عن قاموس (dictionary) في بايثون أي هو عبارة عن مجاميع غير مرتبة من الأزواج (مفتاح: قيمة) مع إشتراط كون المفاتيح ذات قيم فريدة أي غير مُكَرَّرة.
إستعمالٌك ل request.POST['KEY'] قدْ يُثير الخطأ KeyError في حالة عدم تواجد المفتاح KEY في القاموس.
أما إستعمالُك ل request.POST.get('KEY') لا يُثير الخطأ وإنما يقوم بإرجاع القيمة None في حالة عدم تواجد المفتاح في القاموس.
بالإضافة إلى أن استعمال get يُتيح لك خاصية إضافية وهي إرجاع قيمة إفتراضية في حالة عدم تواجد المفتاح في القاموس. مثلاً:
>>> value = request.POST.get('KEY') >>> print(value) None >>> value = request.POST.get('KEY', 'القيمة الإفتراضية') >>> print(value) 'القيمة الإفتراضية' لمزيد من المعلومات عن القواميس يُمكنك زيارة موسوعة حسوب.
كما يُمكنك قراءة بعض المقالات الموجودة في أكاديمية حسوب:
-
إجابة مسعود زاهي سؤال في كيفية التحقق من طول الحقل في نموذج model في جانغو Django؟ كانت الإجابة المقبولة
يُمكنك إشتخدام المُدَقق RegexValidator للتحقق من طول القيمة قبل حفظها في قاعدة البيانات مع مُراعاة أن الرقم الموضوع في العبارة النمطية '^.{10}$' هو نفسه قيمة max_length:
from django.core.validators import RegexValidator #قم باستدعاء المُدقق class MyModel(models.Model): """ قم بإضافة المدقق إلى الحقل وقم باستبدال 10 بالطول الذي تُريده """ national_number = models.CharField('National Number', max_length=10, validators=[RegexValidator(regex='^.{10}$', message='يجب أن يكون طول القيمة يُساوي 10', code='nomatch')]) كما يُمكنك إستخدام المُدقق MinLengthValidator مع مُراعاة أن القيمة المُمَرَّرَةُ له هي نفسها قيمة max_length:
from django.core.validators import MinLengthValidator #قم باستدعاء المُدقق class MyModel(models.Model): """ قم بإضافة المدقق إلى الحقل وقم باستبدال 10 بالطول الذي تُريده """ national_number = models.CharField('National Number', max_length=10, validators=[MinLengthValidator(10)])
-
إجابة مسعود زاهي سؤال في كيفية معرفة عدد العناصر الموجودة في أحد الجداول بإستخدام flask-sqlalchemy في فلاسك Flask؟ كانت الإجابة المقبولة
يُمكنك معرفة عدد العناصر الموجودة في أحد الجداول بإستخدام الدالة count مُباشرة بدون إستعمال مرشحات على الشكل التالي:
table.query.count() أو
session.query(Table).count() # Table # هو اسم النموذج الخاص بك مُلاحظة:
الطريقة أعلاه قد تكون بطيئة نوعًا ما في بعض نُظم قواعد البيانات مثل MySql. للحصول على نتيجة أسرع يُمكن استخدام: from sqlalchemy import func session.query(func.count(Table.id)).scalar()
-
إجابة مسعود زاهي سؤال في ما الفرق بين DecimalField أم FloatField في جانغو Django؟ كانت الإجابة المقبولة
بالرغم من أن النوعين يمثلان الأعداد الحقيقية إلا أنهما يقومان بتمثيلهما بشكل مُختلف فالنوع FloatField يستعمل float من بايثون، بينما يستخدم DecimalField النوع Decimal.
أهم الفروق بينهما:
DecimalField: يجب تعيين الخاصية decimal_places والخاصية max_digits عند إنشاء الحقل. جانغو يقوم بإثارة خطأ في حالة ما إذا كان عدد الأرقام أكبر من قيمة max_digits. مثلاً إذا كان max_digits=5 فإن الأعداد يجب أن تكون أقل من 999.99. جانغو كذلك يقوم بإثارة خطأ في حالة ما إذا كان عدد الأرقام وراء الفاصلة أكبر من قيمة decimal_places. مثلاً إذا كان decimal_places= 1 فأصغر قيمة سوف تكون وراء الفاصلة هي 0.1. إذا قمنا بطباعة نوع القيمة الموجودة داخل الحقل، فإن المخرج سوف يكون decimal.Decimal. في قاعدة البيانات postgresql يُحفظ على الشكل numeric(max_digits, decimal_places). FloatField: إذا قمنا بطباعة نوع القيمة الموجودة داخل الحقل، فإن المخرج سوف يكون float. لا يحتوي على دوال تحقق مثل الموجود في DecimalField. في قاعدة البيانات postgresql يُحفظ على الشكل double precision. لايوجد به تقريب ذكي. بعد عرض الفرق بين الحقلين يأتي السؤال الآن ماذا أستعمل:
عندما يتعلق الأمر بالأسعار فيُنصح دائما باستخدام نوع الحقل DecimalField. يُمكن أيضاً استخدام تطبيق django-money فهو يقوم بإضافة حقل جديد MoneyField خاص بحفظ الأسعار بمختلف العملات.
-
إجابة مسعود زاهي سؤال في هل توجد أدوات لفحص أكواد جانغو Django؟ كانت الإجابة المقبولة
نعم يُمكنك إستخدام تطبيق django-debug-toolbar الذي هو عبارة عن مجموعة من اللوحات التي تعرضُ معلومات لاكتشاف وتصحيح أخطاء متنوعة حول الطلب (requests) و الإستجابة (responses). إليك لقطة شاشة توضح هذا الشريط:
لتثبيت التطبيق نقوم بتنفيذ الأمر التالي:
pip install django-debug-toolbar قم بإضافة التطبيق إلى قائمة تطبيقات المشروع في ملف الإعدادات settings.py:
INSTALLED_APPS = [ # ... "debug_toolbar", # ... ] أضف رابط التطبيق إلى ملف روابط المشروع:
from django.urls import include, path urlpatterns = [ # ... path('__debug__/', include('debug_toolbar.urls')), ] بعدها أضف البرمجية الوسطية (middleware) التالية إلى قائمة البرمجيات الوسطية في ملف الإعدادات:
MIDDLEWARE = [ # ... "debug_toolbar.middleware.DebugToolbarMiddleware", # ... ] بقي فقط أن تُضيف الأيبي الخاص بك إلى الإعدادات كي يظهر الشريط فقط عندك: ( في حالتنا نستخدم الأيبي المحلي localhost)
INTERNAL_IPS = [ # ... "127.0.0.1", # يمكنك إضافة الأيبي المحلي لوكالهوست أو الأيبي الداخلي مثلا: 192.168.1.1 # ... ] وبهذا تكون قد قُمت بإعداد الشريط.
ملاحظة: الشريط لا يظهر إلا في حالة DEBUG = True والأيبي الخاص بك مُتواجد داخل INTERNAL_IPS.
-
إجابة مسعود زاهي سؤال في إنشاء نماذج Models من مخطط قاعدة بيانات Database Schema في جانغو Django؟ كانت الإجابة المقبولة
نعم يُمكن إنشاء نماذج models إنطلاقا من قاعدة بيانات مٌنشأة مٌسبقاً. أولاً عليك بعمل إتصال لهذه القاعدة وذلك بوضع الإعدادات الخاصة بها في ملف إعدادات المشروع settings.py.
DATABASES = { 'default': { 'ENGINE': 'django.db.backends.postgresql', # في هذا المثال استعملنا Postgres 'NAME': 'mydatabase', # ضغ هنا اسم قاعدة البيانات 'USER': 'mydatabaseuser', # ضع هنا اسم المستخدم 'PASSWORD': 'mypassword', # ضع هنا الرقم السري للمستخدم 'HOST': '127.0.0.1', # ضع هنا عنوان الايبي أو اسم النطاق الذي تتواجد فيه قاعدة البيانات 'PORT': '5432', # ضع هنا رقم المنفذ الخاص بقاعدة البيانات المختارة } } بمجرد إعداد الاتصال مع قاعدة البيانات يمكنك إنشاء النماذج تلقائيا باستعمال الأمر inspectdb
python manage.py inspectdb الأمر السابق يقوم بإخراج كل النماذج التي يُمكن لجانغو إنشاؤها من قاعدة البيانات الموجودة . يُمكنك حفظها داخل ملف باستخدام الأمر التالي:
python manage.py inspectdb > models.py يُمكنك أيضاً إستخراج نماذج محددة من قاعدة البيانات باستخدام الأمر التالي:
python manage.py inspectdb table1 table2
-
إجابة مسعود زاهي سؤال في كيفية الوصول إلى قيمة id الخاصة بالسجل الذي تم حفظه للتو في قاعدة البيانات في جانغو Django؟ كانت الإجابة المقبولة
للوصول إلى قيمة id الخاصة بكائن من نموذج ما بعد إنشائه نقوم بحفظ الكائن في متغير ما:
# نحفظ الكائن داخل المتغير # obj obj = MyModel.objects.create(title="post 1", content="Hello, Wolrd") وبعدها للحصول على ال id نكتب:
obj.id أو يُمكننا أيضا إستعمال:
obj.pk
-
إجابة مسعود زاهي سؤال في كيفية جعل أحد الحقول إختياري Optional في جانغو Django؟ كانت الإجابة المقبولة
توجد عدة طرق لجعل الحقل gender إختياري في جانغو ModelForm:
إعادة كتابة الحقل وإضافة required=False class Registration_FORM(ModelForm): #هنا نقوم بإعادة صياغة الحقل gender # وإضافة خاصية اختياري له gender = forms.CharField(required=False) class Meta: model = My_Class fields = ('name', 'email' , 'gender')
أول من خلال الدالة __init__ الخاصة ب Registration_FORM:
class Registration_FORM(ModelForm): class Meta: model = My_Class fields = ('name', 'email' , 'gender') def __init__(self, *args, **kwargs): super(Registration_FORM, self).__init__(*args, **kwargs) # نقوم بإعطاء خاصية إختياري للحقل gender self.fields['gender'].required = False
أو جعل الحقل gender إختياري في النموذج My_Class:
class My_Class(models.Model): .... gender = models.Charfield(max_length=20, blank=True, null=True) ^^^^^^^^^^^ ^^^^^^^^^ نُضيف blank=True و null=True لكي نجعل الحقل يقبل القيمة None والقيمة الفارغة.
-
إجابة مسعود زاهي سؤال في حساب عدد المنتجات في تصنيف معين في جانغو Django؟ كانت الإجابة المقبولة
لحساب عدد المنتجات في كل وسم (Tag) نقوم بالدمج بين الدوال التالية:
Count: التي تقومُ بحساب المنتجات في كل وسم annotate: التي تقوم بإنشاء حقل جديد للنتيجة. (الحقل الذي سوف نضيفه هو count). values: لتحديد حقول معينة من الكائنات في النتيجة النهائية. from django.db.models import Count # نستدعي الدالة Count result = Product.objects .values('tag') # نحدد الحقول التي ستظهر في النتيجة النهائية .annotate(count=Count('tag')) # نقوم بإنشاء حقل جديد count .order_by() النتيجة سوف تكون مماثلة لجملة ال SQL التالية:
SELECT tag_id, COUNT(tag_id) AS count FROM product GROUP BY tag_id النتيجة النهائية سوف تكون على الشكل:
[{'tag': 'tag1', 'count': 12}, {'tag': 'tag2', 'count': 20}, ....]