
كيفية برمجة تطبيق محفظة مالية باستخدام Python Django
في عصرنا الرقمي، أصبحت تطبيقات المحافظ المالية أداة أساسية لإدارة أموالنا بكفاءة.
إذا كنت تطمح لتعلم كيفية برمجة تطبيق محفظة مالية باستخدام
Python Django، فأنت في المكان الصحيح. هذا الدليل الشامل سيأخذك
خطوة بخطوة خلال عملية إنشاء تطبيق بسيط ولكنه فعال لتتبع وإدارة المعاملات المالية.
سنتناول كل شيء بدءًا من تصميم واجهة مستخدم سهلة الاستخدام لعرض
الأرصدة والمعاملات، مرورًا بتعريف نماذج البيانات لتخزين معلومات الحسابات
والمعاملات، وصولًا إلى تمكين المستخدمين من إضافة معاملات جديدة و حفظ بيانات المعاملات،
وأخيرًا نشر التطبيق ليصبح متاحًا للاستخدام. انطلق معنا في هذه الرحلة لتعلم كيفية
برمجة تطبيق محفظة مالية باستخدام Python Django بطريقة منظمة وآمنة.
خطوات برمجة تطبيق محفظة مالية باستخدام Python Django
الخطوة 1: إعداد بيئة التطوير وإنشاء مشروع Django
* تأكد من تثبيت Python و pip على جهازك. ثم قم بتثبيت Django:
pip install django
--
* أنشئ مشروع Django جديدًا باسم financial_wallet:
django-admin startproject financial_wallet
cd financial_wallet
--
* أنشئ تطبيقًا داخل المشروع باسم wallet:
python manage.py startapp wallet
--
الخطوة 2: تعريف نماذج البيانات (Models)
في ملف wallet/models.py، سنقوم بتعريف نماذج البيانات الأساسية للحسابات والمعاملات:
Pythonfrom django.db import modelsfrom django.contrib.auth.models import Userfrom django.utils import timezoneclass Account(models.Model):user = models.ForeignKey(User, on_delete=models.CASCADE)name = models.CharField(max_length=100)balance = models.DecimalField(max_digits=15, decimal_places=2, default=0.00)created_at = models.DateTimeField(auto_now_add=True)def __str__(self):return f"{self.name} ({self.user.username})"class Transaction(models.Model):TRANSACTION_TYPES = [('income', 'إيداع'),('expense', 'سحب'),]account = models.ForeignKey(Account, on_delete=models.CASCADE, related_name='transactions')transaction_type = models.CharField(max_length=10, choices=TRANSACTION_TYPES)amount = models.DecimalField(max_digits=15, decimal_places=2)description = models.CharField(max_length=255, blank=True, null=True)transaction_date = models.DateTimeField(default=timezone.now)created_at = models.DateTimeField(auto_now_add=True)def __str__(self):return f"{self.get_transaction_type_display()} - {self.amount} ({self.account.name})"def save(self, *args, **kwargs):if self.transaction_type == 'income':self.account.balance += self.amountelif self.transaction_type == 'expense':self.account.balance -= self.amountself.account.save()super().save(*args, **kwargs)
* أضف تطبيق wallet إلى قائمة INSTALLED_APPS في
ملف financial_wallet/settings.py:
Python
INSTALLED_APPS = [
'django.contrib.admin',
'django.contrib.auth',
'django.contrib.contenttypes',
'django.contrib.sessions',
'django.contrib.messages',
'django.contrib.staticfiles',
'wallet', # إضافة تطبيق wallet هنا
]
--
* قم بإنشاء التغييرات وتنفيذها:
python manage.py makemigrations wallet
python manage.py migrate
--
الخطوة 3: إنشاء واجهة المستخدم (Templates)
أنشئ مجلدًا باسم templates داخل مجلد تطبيق wallet. ثم أنشئ ملفات HTML التالية:
* wallet/templates/wallet/account_list.html: لعرض قائمة الحسابات والرصيد:
HTML
<!DOCTYPE html>
<html>
<head>
<title>محفظتي المالية</title>
</head>
<body>
<h1>حساباتي</h1>
<ul>
{% for account in accounts %}
<li>
<h2>{{ account.name }}</h2>
<p>الرصيد: {{ account.balance }}</p>
<p><a href="{% url 'account_detail' account.id %}">عرض التفاصيل</a></p>
</li>
{% empty %}
<li>لا يوجد لديك حسابات حاليًا.</li>
{% endfor %}
</ul>
<p><a href="{% url 'add_transaction' %}">إضافة معاملة جديدة</a></p>
</body>
</html>
--
* wallet/templates/wallet/account_detail.html:
لعرض تفاصيل الحساب والمعاملات:
HTML
<!DOCTYPE html>
<html>
<head>
<title>{{ account.name }}</title>
</head>
<body>
<h1>{{ account.name }}</h1>
<p>الرصيد الحالي: {{ account.balance }}</p>
<h2>المعاملات</h2>
<ul>
{% for transaction in account.transactions.all %}
<li>
{{ transaction.get_transaction_type_display }} - {{ transaction.amount }}
{% if transaction.description %}
({{ transaction.description }})
{% endif %}
({{ transaction.transaction_date }})
</li>
{% empty %}
<li>لا توجد معاملات لهذا الحساب حتى الآن.</li>
{% endfor %}
</ul>
<p><a href="{% url 'add_transaction' %}">إضافة معاملة جديدة</a></p>
<p><a href="{% url 'account_list' %}">العودة إلى قائمة الحسابات</a></p>
</body>
</html>
--
* wallet/templates/wallet/add_transaction.html:
نموذج لإضافة معاملة جديدة:
HTML
<!DOCTYPE html>
<html>
<head>
<title>إضافة معاملة</title>
</head>
<body>
<h1>إضافة معاملة جديدة</h1>
<form method="post">
{% csrf_token %}
{{ form.as_p }}
<button type="submit">حفظ المعاملة</button>
</form>
<p><a href="{% url 'account_list' %}">العودة إلى قائمة الحسابات</a></p>
</body>
</html>
--
الخطوة 4: إنشاء النماذج (Forms)
في ملف wallet/forms.py (إذا لم يكن موجودًا، قم بإنشائه)،
سنقوم بإنشاء نموذج لإضافة المعاملات:
Pythonfrom django import formsfrom .models import Transaction, Accountclass AddTransactionForm(forms.ModelForm):account = forms.ModelChoiceField(queryset=Account.objects.none())transaction_type = forms.ChoiceField(choices=Transaction.TRANSACTION_TYPES)amount = forms.DecimalField(max_digits=15, decimal_places=2)description = forms.CharField(max_length=255, required=False)transaction_date = forms.DateTimeField(widget=forms.DateTimeInput(attrs={'type': 'datetime-local'}))class Meta:model = Transactionfields = ['account', 'transaction_type', 'amount', 'description', 'transaction_date']def __init__(self, user, *args, **kwargs):super().__init__(*args, **kwargs)self.fields['account'].queryset = Account.objects.filter(user=user)
الخطوة 5: إنشاء طرق العرض (Views)
في ملف wallet/views.py، سنقوم بإنشاء طرق العرض التي
تتحكم في منطق التطبيق وتعرض القوالب:
Pythonfrom django.shortcuts import render, redirect, get_object_or_404from .models import Account, Transactionfrom .forms import AddTransactionFormfrom django.contrib.auth.decorators import login_required@login_requireddef account_list(request):accounts = Account.objects.filter(user=request.user)return render(request, 'wallet/account_list.html', {'accounts': accounts})@login_requireddef account_detail(request, account_id):account = get_object_or_404(Account, id=account_id, user=request.user)return render(request, 'wallet/account_detail.html', {'account': account})@login_requireddef add_transaction(request):if request.method == 'POST':form = AddTransactionForm(request.user, request.POST)if form.is_valid():transaction = form.save(commit=False)transaction.user = request.user # قد لا تحتاجها إذا كان الحساب مرتبطًا بالمستخدمtransaction.save()return redirect('account_list')else:form = AddTransactionForm(request.user)return render(request, 'wallet/add_transaction.html', {'form': form})
الخطوة 6: تعريف مسارات URL (URLs)
* في ملف wallet/urls.py (إذا لم يكن موجودًا، قم بإنشائه):
Python
from django.urls import path
from . import views
urlpatterns = [
path('', views.account_list, name='account_list'),
path('account/<int:account_id>/', views.account_detail, name='account_detail'),
path('transaction/add/', views.add_transaction, name='add_transaction'),
]
--
* قم بتضمين مسارات تطبيق wallet في ملف financial_wallet/urls.py:
Python
from django.contrib import admin
from django.urls import path, include
urlpatterns = [
path('admin/', admin.site.urls),
path('wallet/', include('wallet.urls')),
path('accounts/', include('django.contrib.auth.urls')), # لتسجيل الدخول والخروج
path('', redirect('/wallet/')), # إعادة التوجيه إلى قائمة الحسابات عند الوصول إلى الجذر
]
--
الخطوة 7: إنشاء واجهة إدارة (Django Admin)
لتسهيل إدارة الحسابات والمعاملات، قم بتسجيل النماذج في
Django Admin في ملف wallet/admin.py :
Pythonfrom django.contrib import adminfrom .models import Account, Transaction@admin.register(Account)class AccountAdmin(admin.ModelAdmin):list_display = ('name', 'user', 'balance', 'created_at')list_filter = ('user',)search_fields = ('name', 'user__username')@admin.register(Transaction)class TransactionAdmin(admin.ModelAdmin):list_display = ('account', 'transaction_type', 'amount', 'transaction_date', 'created_at')list_filter = ('account', 'transaction_type')search_fields = ('description', 'account__name')
* قم بإنشاء مستخدم مسؤول إذا لم يكن لديك واحدًا بالفعل:
python manage.py createsuperuser
--
ثم قم بتشغيل خادم التطوير وقم بزيارة http://127.0.0.1:8000/admin/ لتسجيل الدخول وإدارة الحسابات والمعاملات.
الخطوة 8: حفظ النقاط (بيانات الحسابات والمعاملات)
يتم حفظ بيانات الحسابات والمعاملات تلقائيًا في قاعدة البيانات عند إنشائها
وتعديلها من خلال واجهة Django Admin أو من خلال تفاعلات المستخدمين
مع النماذج في الواجهة الأمامية (مثل إضافة معاملة). لاحظ أننا قمنا بتضمين
منطقًا في طريقة حفظ نموذج Transaction لتحديث رصيد الحساب المرتبط تلقائيًا.
Django ORM يتولى عملية التفاعل مع قاعدة البيانات وحفظ البيانات بناءً على تعريف النماذج والعلاقات بينها.
الخطوة 9: نشر التطبيق
لنشر تطبيق Django، يمكنك اتباع الخطوات العامة التالية
(باستخدام Gunicorn و Nginx كمثال):
* تثبيت Gunicorn:
pip install gunicorn
--
اختبار Gunicorn: انتقل إلى مجلد مشروع Django وقم بتشغيل:
gunicorn financial_wallet.wsgi:application
--
* تثبيت Nginx:
sudo apt update
sudo apt install nginx
--
* تكوين Nginx: قم بإنشاء ملف تكوين جديد للموقع الخاص بك في
/etc/nginx/sites-available/ (مثل financial_wallet) وقم بربطه
بـ /etc/nginx/sites-enabled/. مثال على التكوين:
Nginx
server {
listen 80;
server_name your_domain_or_IP;
location /static/ {
alias /path/to/your/project/staticfiles/;
}
location / {
proxy_pass http://127.0.0.1:8000;
proxy_set_header Host $host;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
}
}
--
استبدل your_domain_or_IP بعنوان نطاقك أو عنوان IP الخاص
بالخادم، و /path/to/your/project/staticfiles/ بالمسار الفعلي لمجلد الملفات الثابتة الخاص بك.
* جمع الملفات الثابتة: قبل النشر، قم بجمع الملفات الثابتة باستخدام:
python manage.py collectstatic
--
تكوين نظام إدارة العمليات (مثل systemd) لتشغيل Gunicorn تلقائيًا.
* إعادة تشغيل Nginx:
sudo systemctl restart nginx
--
تأمين الخادم الخاص بك (مثل إعداد جدار حماية وتكوين HTTPS باستخدام Let's Encrypt).
* الخلاصة :
لقد استعرضنا الخطوات الأساسية لبرمجة تطبيق محفظة مالية بسيط باستخدام
Python Django، بدءًا من إنشاء واجهة المستخدم لعرض الحسابات
والمعاملات، مرورًا بتعريف نماذج البيانات و النماذج لتمكين المستخدمين من
إضافة المعاملات، وصولًا إلى حفظ هذه البيانات في قاعدة البيانات وتقديم نظرة
عامة على عملية نشر التطبيق. يمكنك الآن تطوير هذا التطبيق بإضافة المزيد
من الميزات مثل دعم أنواع مختلفة من الحسابات، وتقارير الإنفاق، والمزيد من التحليلات المالية.
تذكر دائمًا التركيز على أمان التطبيق المالي وحماية بيانات المستخدمين.