فصل ۱: شروع درست — معماری، ساختار پروژه و Custom User

manage.py و دستورات مهم؛ ساخت دستور مدیریتی اختصاصی

manage.py؛ کنترل پنل خط فرمان پروژه

manage.py همان django-admin است که از قبل DJANGO_SETTINGS_MODULE را روی تنظیمات پروژه‌ی شما گذاشته. هر کاری که «یک بار» یا «زمان‌بندی‌شده» انجام می‌شود — ساخت ادمین، پاک‌سازی داده، ورود اکسل — جایش یک دستور مدیریتی است، نه یک View مخفی.

دستورهایی که هر روز لازم دارید

دستورکاربرد
runserver 0.0.0.0:8000سرور توسعه؛ با 0.0.0.0 از گوشی در همان شبکه هم باز می‌شود
makemigrations / migrateساخت و اجرای migration (فصل ۲)
createsuperuserساخت کاربر مدیر
shellپایتون تعاملی با تنظیمات پروژه
dbshellکلاینت خط فرمان همان پایگاه داده (psql، sqlite3)
check / check --deployبررسی خطاهای پیکربندی و امنیتی
dumpdata / loaddataخروجی و ورودی JSON داده‌ها
collectstaticجمع‌کردن فایل‌های static برای سرور
changepassword 09121234567عوض کردن رمز یک کاربر
sendtestemail you@example.irآزمون سریع تنظیمات ایمیل

یک دستور اختصاصی: لغو سفارش‌های رهاشده

فایل باید در مسیر apps/orders/management/commands/ باشد (هر دو پوشه با __init__.py) و نام فایل، نام دستور می‌شود:

# apps/orders/management/commands/cancel_stale_orders.py
from datetime import timedelta

from django.core.management.base import BaseCommand
from django.utils import timezone

from apps.orders.models import Order


class Command(BaseCommand):
    help = "سفارش‌های پرداخت‌نشده‌ی قدیمی‌تر از N روز را لغو می‌کند"

    def add_arguments(self, parser):
        parser.add_argument("--days", type=int, default=3)
        parser.add_argument("--dry-run", action="store_true")

    def handle(self, *args, **opts):
        limit = timezone.now() - timedelta(days=opts["days"])
        qs = Order.objects.filter(status="pending", created_at__lt=limit)
        count = qs.count()
        if opts["dry_run"]:
            self.stdout.write(f"{count} سفارش لغو خواهد شد (آزمایشی).")
            return
        qs.update(status="cancelled")
        self.stdout.write(self.style.SUCCESS(f"{count} سفارش لغو شد."))
python manage.py cancel_stale_orders --days 5 --dry-run
python manage.py cancel_stale_orders --days 5

روی سرور همین دستور را با cron یا systemd timer زمان‌بندی می‌کنید؛ در کد هم با django.core.management.call_command("cancel_stale_orders", days=5) قابل صدا زدن است (مثلاً داخل تست).

نکته‌هایی که کمتر کسی می‌داند

  • در Django 5.2 دستور shell همه‌ی مدل‌های اپ‌های نصب‌شده را خودکار import می‌کند؛ دیگر لازم نیست هر بار from apps.orders.models import Order بنویسید.
  • python manage.py shell -c "..." یک خط کد را بدون ورود به محیط تعاملی اجرا می‌کند؛ برای اسکریپت‌های سریع روی سرور عالی است.
  • در PowerShell خروجی dumpdata > data.json را با UTF-16 می‌نویسد و loaddata بعداً خطا می‌دهد؛ به‌جایش از گزینه‌ی -o data.json خود دستور استفاده کنید.
  • برای dumpdata قابل‌انتقال از --natural-foreign -e contenttypes -e auth.permission استفاده کنید؛ وگرنه روی پایگاه داده‌ی تازه به خطای تکراری بودن کلید برمی‌خورید.
  • نام گزینه‌ی --dry-run در opts با زیرخط (dry_run) می‌آید؛ این رفتار argparse است و منشأ یک KeyError رایج.

برای ذخیره‌ی پیشرفت و شرکت در آزمون، وارد شوید — رایگان است.