محمد حجي2
-
المساهمات
34 -
تاريخ الانضمام
-
تاريخ آخر زيارة
إجابات الأسئلة
-
إجابة محمد حجي2 سؤال في كيفية السماح للمستخدمين بعمل أرشيف مضغوط يتم إنشاؤه ديناميكيًا في جانغو Django؟ كانت الإجابة المقبولة
في Django في حال كنت تعتقد أن عملية معينة ستحتاج منك وقت عند الطلب وجعل الموقع الخاص بك أبطء فعليك بالستخدام ما يسمى ب celery
ما هو celery هو سيرفر منفصل تقوم بإنشائه أسمه celery تقوم من خلاله ترحيل العمليات التي تقتعد أخذ وقت إضافي ولا يحتاج المستخدم لإنتظار الصفحة حتى تنتهي من العملية على سبيل المثال العمليات الخاصة بإرسال الإيميلات و ملفات و أمور التي تحتاح وقت للعمل عليها.
طريقة عمل ذلك كتالي:(مثال)
أنشئ ملف
proj/proj/celery.py
import os from celery import Celery # Set the default Django settings module for the 'celery' program. os.environ.setdefault('DJANGO_SETTINGS_MODULE', 'proj.settings') app = Celery('proj') # Using a string here means the worker doesn't have to serialize # the configuration object to child processes. # - namespace='CELERY' means all celery-related configuration keys # should have a `CELERY_` prefix. app.config_from_object('django.conf:settings', namespace='CELERY') # Load task modules from all registered Django apps. app.autodiscover_tasks() @app.task(bind=True) def debug_task(self): print(f'Request: {self.request!r}')
كيفية أعداد celery:
اولاً عليك تثبيت RabbitMQ ينصح إستخدام أنظمة لينكس:
$ sudo apt-get install rabbitmq-server ثم تشغيله:
قم بتشغيله في نافذة أوامر منفصلة
$ docker run -d -p 5672:5672 rabbitmq ستظهر لك العبارة التالية Starting rabbitmq-server: SUCCESS.
لتحميل RabbitMQ من هنا.
الأن سنقوم بتثبيت Celery:
pip install celery لنقم بإعداد أول مهمة عبر celery قم بإنشاء ملف بإسم tasks.py في مشروعك:
أضف الكود التالي في الملف:
from celery import Celery app = Celery('tasks', broker='pyamqp://guest@localhost//') """ هذه دالة سوف يتم تنفيذها بشكل منفصل عند إستدعائها من خلال عملية أخرى في النظام وستعمل في موجه أوامر منفصل عن اللذي قمت بتشغيل عليه runserver """ @app.task def add(x, y): return x + y و الأن تشغيل the Celery worker server:
في موجه أوامر منفصل لا تقم بإغلاقه سيتم تشغيل app.task عليه أكتب الأمر التالي:
$ celery -A tasks worker --loglevel=INFO لأستدعاء الأمر في أي مكان من المشروع ما عليك سوى فعل التالي:
from tasks import add add.delay(4, 4) تمت معالجة المهمة الآن بواسطة موجه الأوامر الذي بدأته سابقًا. يمكنك التحقق من ذلك من خلال النظر في مخرجات في موجه الأوامر.
يمكنك معرفة المزيد من خلال documentation الخاص ب celery.
وبما أنك تريد ضغط ملفات يمكنك وضع عميلة الضغط ك task و تفعيله داخل celery حتى لا تجعل الموقع بطئ.
-
إجابة محمد حجي2 سؤال في اتعلم لارافيل أم Asp.net؟ كانت الإجابة المقبولة
أيهما افضل تعلم لارافيل او asp.net دعيني اضيف عليهم Django هي أيضا الأخرى من أطر تطوير مواقع ويب مبنية على بايثون.
لبناء متجر الكتروني متكامل يمكنك إستخدام اي واحدة و ستقدم لك كل ميزات مطلوبة لبناء المتجر ولكن سأقوم بترتيب سهولة تطوير و تعلم على أسئلة التي سألتها
من ناحية فرص العمل أيهما افضل؟
كلها لديها فرص عمل طالما أتقنت إحداها ولكن إذا تكلمنا عن فرص عمل في وطن عربي ف لارفيل أشهرها و بنسبة للشركات كبيرة asp.net
أما في دول أوروبية أو أجنبية فتعتبر Django الأكثر طلبا فيعتمد تعلمك لإطار عمل معين على سوق مستهدف حسب ما ذكرت أنفا.
بنسبة لنشر المشروع و تشغيله سأرتبها من أسهل الى أصعب من تجربتي.
Django أسهل إيطار عمل يمكن تنصيبه و تشغيله على كل أنظمة تشغيل ويندوز و لينكس و ماك ويمكن تشغيل كود على ٣ منصات بدون اضافة إي تعديلات فكل ما عليك تثبيته هو حزمة بايثون على جهازك و من ثم تنزيل مكتبة Django بأمر واحد و لا تحتاج تثبيت سيرفر لتشغيلها و أمور أخرى تجعلها سهلة إعداد.
من ثم لارفيل و asp.net تقريبآ على نفس مستوى صعوبة أو وقت مبذول لإعداد بيئة عمل تطوير علما بأن asp.net تشغلها حصري على أجهزة ويندوز عكس باقي الخيارات.
إضافات مكتبات مجانية مساعدة، كل لغات برمجة لها مجتمع مطورين كبير ستجدين فيه أغلب مكتبات لتي تحتاجينها لكن مجتمع مطورين بايثون و php مستقلين أكبر فأتوقع ستجدينها بشكل أسرع في Django و لارفيل.
ربط مع وسائل الدفع، موجودة و متوفر لها شرح لكل أطر عمل.
أتمني أن يكون شرحي وجيز قد أضاف شئ يساعدك على تحديد مناسب لك يمكنك بحث عن ميزات كل إيطار عمل على حذا لمعرفة مزيد من تفاصيل و إختيار مناسب لك.
-
إجابة محمد حجي2 سؤال في ما الفرق بين field=None و field__isnull=True في جانغو Django؟ كانت الإجابة المقبولة
تقوم الطريقة الثانية ب تصفية قيم empty or NULL في queryset أي قيم None و الفارغة.
queryset = Model.objects.filter(field__isnull=True) أما الأولى فأنت قمت بتحديد قيم None يدوياً فعملها هو البحث عن (field=None) فقط وليس الفارغة
-
إجابة محمد حجي2 سؤال في ما هو الفرق بين كل أنواع المستخدمين superuser و staff و admin في جانغو Django؟ كانت الإجابة المقبولة
الفرق الوحيد بين كل واحد منهم هو الصلاحيات فصلاحية superuser هي الأعلى فيمكنه التحكم بكل صلاحيات المستخدمين الأخرين من إضافة مستخدمين او احذفهم و التعديل على كل البيانات في النظام .
أما staff فيمكنه التعديل على البيانات أو الوصول لبعض البيانات أو الجداول حسب الصلاحيات المعطية له من قبل superuser.
عند إستخداتم أمر createuperuser فأنت تقوم بإنشاء صاحب النظام و الذي يمكنه التحكم بكل شيء موجود في admin control Panel.
-
إجابة محمد حجي2 سؤال في كيفية عرض إستعلام SQL عند التعديل في نموذج Model في جامعة Django؟ كانت الإجابة المقبولة
لقد تم تصميم أطر البرمجية ك جانقو او لارفيل و أغلب أطر أخرى لتخطي أمور الروتينية التي كان مطور نيتف* يقوم بها في قواعد البيانات فبدل تضيع الوقت في كتابة جمل برمجية SQL ستركز على تطوير ميزات التطبيق أو المشروع الخاص بك في حال كنت تريد تعلم المزيد عن جمل SQL و عملها في بايثون
أو أي لغة أخرى فقط قم بالبحث على طريقة استخدام SQL مع لغة التي تريدها و منها ستعرف كيف يتم إتصال بشكل يدوي بقواعد البيانات و إنشاء قواعد البيانات و الجداول و إضافة البيانات على كل جدول و عمل جمل إستعالمة على جداول و أمور كثيرة لا ترهق نفسك بهذه التفاصيل عند تطويرك مشاريع على إيطار العمل جانقو Django لكن تعلم SQL نفسها سيكون مفيداً بلا شك لتعامل مع قواعد البيانات خارج إطار العمل Django.
(أي البرمجة بدون أطر عمل framework )*
للمزيد من التفاصيل عن SQL
-
إجابة محمد حجي2 سؤال في سؤال في لغة c++ كانت الإجابة المقبولة
طريقة معرفة عناصر مكررة في المصفوفة.
أولاً ، سيُطلب من المستخدم إدخال الحجم المصفوفة وبعد ذلك سيعطي المستخدم العناصر وسنجد العناصر المكررة في مصفوفة .
يوجد شرح داخل الكود.
#include <iostream> using namespace std // دالة البحث عن التكرار void duplicate_element(int arr[], int num) // finding duplicate values { int i, j; printf("Repeating elements are following: "); for(i = 0;i < num;i++) { for(j = i+1;j < num;j++) { if(arr[i] == arr[j]) { cout << arr[j] << " "; } } } } // main fun int main() { int no; cout<<"enter the size of array"; cin >> no; // taking size of array ادخال عدد العناصر int ele[no]; int i; cout<<"\n enter elements:"; // taking elements. for(i = 0; i < no; i++) { cin >> ele[i]; // ادخال العناصر حسب العدد المدخل مسبقاً } duplicate_element(ele,no); // passing value to function طباعة الأعداد مكررة return 0; } ستكون النتيجة كالتالي:
-
إجابة محمد حجي2 سؤال في سؤال في لغة c++ كانت الإجابة المقبولة
لإستخراج الرقم الناقص من سلسلة ارقام سنقوم بالتالي:
تستخدم هذه الطريقة تقنية معادلة الجمع.
النهج: طول المصفوفة هو n-1. لذلك ، يمكن حساب مجموع جميع العناصر n ، أي مجموع الأرقام من 1 إلى n باستخدام الصيغة n * (n + 1) / 2.
الآن أوجد مجموع كل العناصر في المصفوفة واطرحه من مجموع أول عدد طبيعي n ، سيعطينا قيمة العنصر المفقود.
الخوارزمية:
احسب مجموع أول n من الأعداد الطبيعية كمجموع = n * (n + 1) / 2 قم بإنشاء مجموع متغير لتخزين مجموع عناصر المصفوفة. اجتياز المصفوفة من البداية إلى النهاية. قم بتحديث قيمة المجموع كـ sum = sum + array [i] اطبع العدد المفقود كـ SumTotal - sum #include <bits/stdc++.h> using namespace std; // دالة فحص السلسلة ارقام أو مصفوفة int getMissingNo(int a[], int n) { int total = (n + 1) * (n + 2) / 2; // for (int i = 0; i < n; i++) total -= a[i]; return total; } // Driver Code int main() { int arr[] = { 1, 3, 4, 5, 6 }; int n = sizeof(arr) / sizeof(arr[0]); int miss = getMissingNo(arr, n); cout << miss; } وفي حالة هذا الكود سيكون الناتج (2):
هذا الكود سيساعدك على حل السؤال الخاص بك.
-
إجابة محمد حجي2 سؤال في كيفية حساب عدد المستخدمين الذين لديهم أكثر من 10 منشورات في جانغو Django؟ كانت الإجابة المقبولة
جرب الطريقة التالية:
أولا يجب أن يكون models post يحتوى على user = models.ForeignKey(auth.User)
class Post(models.Model): user = models.ForeignKey(auth.User) # ... more fields ... ستقوم بكتابة السطر التالي :
حيث هنا ستستخدم مكتبة Count في ملف فيو:
from django.db.models import Count user_posts = User.objects.annotate(total_posts = Count('post')) وفي ملف Template:
{% for user in user_posts %} <p>{{user.first_name}} has written {% user.total_posts %} posts so far <p> {% endfor %}
-
إجابة محمد حجي2 سؤال في كيفية إضافة حقل field إلى نموذج form ديناميكيًا في جانغو Django؟ كانت الإجابة المقبولة
حتى تستطيع إضافة حقل بشكل ألي و ديناميكي يجب إستخدام بعض من JS جافا سكربت سكون الشرح على 3 خطوات أولا ما سوف تفعله في ملف templates لماذا يجب إستخدام JS في المتصفح لتعديل على elements أو عناصر HTML بدون إعادة تحميل الصفحة يجب استخدام لغة برمجة تعمل على المتصفح نفسه.
مثال على الفكرة المطلوبة
أولاً views.py
from django.contrib.auth.decorators import login_required from django.forms.models import modelformset_factory # model form for querysets from django.shortcuts import redirect, render, get_object_or_404 from .forms import RecipeForm, RecipeIngredientForm from .models import Recipe, RecipeIngredient @login_required def recipe_update_view(request, id=None): obj = get_object_or_404(Recipe, id=id, user=request.user) form = RecipeForm(request.POST or None, instance=obj) # Formset = modelformset_factory(Model, form=ModelForm, extra=0) RecipeIngredientFormset = modelformset_factory(RecipeIngredient, form=RecipeIngredientForm, extra=0) qs = obj.recipeingredient_set.all() # [] formset = RecipeIngredientFormset(request.POST or None, queryset=qs) context = { "form": form, "formset": formset, "object": obj } if all([form.is_valid(), formset.is_valid()]): parent = form.save(commit=False) parent.save() # formset.save() for form in formset: child = form.save(commit=False) child.recipe = parent child.save() context['message'] = 'Data saved.' return render(request, "recipes/create-update.html", context) ثانياً: recipes/create-update.html: templates
أولاً جزء HTML
{% if formset %} <h3>Ingredients</h3> {{ formset.management_form }} <div id='ingredient-form-list'> {% for form in formset %} <div class='ingredient-form'> {{ form.as_p }} </div> {% endfor %} </div> <div id='empty-form' class='hidden'>{{ formset.empty_form.as_p }}</div> <button id='add-more' type='button'>Add more</button> {% endif %} <button style='margin-top:10px;' type='submit' >Save</button> </form> </div> والأن مع جزء JS وسيكون في نفس ملف HTML في النهاية.
<script> const addMoreBtn = document.getElementById('add-more') const totalNewForms = document.getElementById('id_form-TOTAL_FORMS') addMoreBtn.addEventListener('click', add_new_form) function add_new_form(event) { if (event) { event.preventDefault() } const currentIngredientForms = document.getElementsByClassName('ingredient-form') const currentFormCount = currentIngredientForms.length // + 1 const formCopyTarget = document.getElementById('ingredient-form-list') const copyEmptyFormEl = document.getElementById('empty-form').cloneNode(true) copyEmptyFormEl.setAttribute('class', 'ingredient-form') copyEmptyFormEl.setAttribute('id', `form-${currentFormCount}`) const regex = new RegExp('__prefix__', 'g') copyEmptyFormEl.innerHTML = copyEmptyFormEl.innerHTML.replace(regex, currentFormCount) totalNewForms.setAttribute('value', currentFormCount + 1) // now add new empty form element to our html form formCopyTarget.append(copyEmptyFormEl) } </script> {% endblock content %} قد يكون ليس من السهل فهم كل شئ في كود JS لكن ما يقوم به كود SCRIPT هو نسخ أحد العناصر من HTML عند حدوث حدث click على الزر Add more
و في نفس الوقت يتم التعديل على بعض Attribute في عناصر Html الجديدة و بعد القيام بأي حفظ للبيانات سيقوم بعرض ما تم حفظه اقرأ الأكواد جيداً يستحسن أن يكون لديك فكرة عامة عن JS و أتوقع ان يكون الكود مفهوم بالنسبة لك وهذا المثال ليساعدك على حل مشكلة الخاصة بك
-
إجابة محمد حجي2 سؤال في كيفية تسجيل دخول المستخدم تلقائيًا بعد التسجيل في الموقع في جانغو django؟ كانت الإجابة المقبولة
مرحبا Mohssen تعتمد إجابة السؤال على طريقة عمل الموقع الخاص بك في حال كنت تستخدم طريقة Templet فالطريقة الأمثل هي استخدام الدوال ()authenticate() and login يمكنك الوصول للمزيد من المعلومات عن الدالتين بالضعط عليهما:
حيث ستقوم بإستدعاء كل من هاتين الدالتين من مكتبة auth الخاصة ب Django في ملفات views
في هذه الحالة سيتم تحويل المستخدم مباشرة لصفحة الرئيسية.
هذا الكود مثال على ذالك في دالة تسجيل حساب جديد في views
from django.contrib.auth import authenticate, login def register(request): if request.method == 'POST': form = UserCreationForm(request.POST) if form.is_valid(): new_user = form.save() messages.info(request, "Thanks for registering. You are now logged in.") new_user = authenticate(username=form.cleaned_data['username'], password=form.cleaned_data['password1'], ) login(request, new_user) return HttpResponseRedirect("/dashboard/") طبعاً ['username'] و ['password1']هم البيانات القادمة من الفورم التسجيل.
و السطر التالي login(request, new_user) سيقوم بعملية التسجيل و بعدها ستقوم الدالة def register(request):
بتحويل المستخدم لصفحة التي تريد المستخدم الذهاب لها فور تسجيله الحساب أول مرة.
لكن في حالة كنت تتعامل مع API فالموضوع له منحنى اخر لطريقة التعامل مع هذا الموضوع لكن اتوقع انك تتكلم عن طريقة Templet
ان شاء الله كان الشرح وافياً و مفهوماً. في حال كان لديك استفسار اخر سأكون سعيد بسماع ردك.
تحياتي.