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

نصب در venv و ساخت پروژه با ساختار config/ و apps/

یک شروع تمیز که بعداً پشیمان نشوید

ساختار پیش‌فرض startproject پوشه‌ی تنظیمات را هم‌نام پروژه می‌سازد (mysite/mysite/settings.py) و اپ‌ها را کنار آن پراکنده می‌کند. در پروژه‌های واقعی دو قرارداد ساده خیلی کمک می‌کند: پوشه‌ی تنظیمات را config بنامید و همه‌ی اپ‌ها را داخل پوشه‌ی apps بگذارید.

ساخت محیط مجازی روی ویندوز (PowerShell)

mkdir carpet-orders
cd carpet-orders
py -3.12 -m venv .venv
.\.venv\Scripts\Activate.ps1
python -m pip install --upgrade pip
pip install "django>=5.2,<6.0" python-dotenv
django-admin startproject config .
mkdir apps
New-Item apps\__init__.py -ItemType File
mkdir apps\orders
python manage.py startapp orders apps\orders

نقطه‌ی آخر startproject config . یعنی «همین پوشه»؛ بدون آن یک لایه پوشه‌ی اضافه ساخته می‌شود. روی لینوکس به‌جای Activate.ps1 از source .venv/bin/activate استفاده کنید.

ساختار نهایی

carpet-orders/
├── .venv/
├── .env                 # رمزها؛ هرگز در git نه
├── manage.py
├── requirements.txt
├── config/
│   ├── settings.py
│   ├── urls.py
│   ├── wsgi.py
│   └── asgi.py
├── apps/
│   ├── accounts/        # Custom User
│   ├── catalog/         # طرح‌های فرش
│   └── orders/
├── templates/
└── static/

یک اصلاح ضروری در apps.py

وقتی اپ داخل پوشه‌ی apps است، مسیر پایتونی آن apps.orders است؛ پس باید name را در apps.py اصلاح و همان را در INSTALLED_APPS ثبت کنید:

# apps/orders/apps.py
from django.apps import AppConfig

class OrdersConfig(AppConfig):
    default_auto_field = "django.db.models.BigAutoField"
    name = "apps.orders"          # مسیر ایمپورت
    verbose_name = "سفارش‌ها"     # عنوان فارسی در ادمین

# config/settings.py
INSTALLED_APPS = [
    "django.contrib.admin",
    "django.contrib.auth",
    "django.contrib.contenttypes",
    "django.contrib.sessions",
    "django.contrib.messages",
    "django.contrib.staticfiles",
    "apps.accounts",
    "apps.catalog",
    "apps.orders",
]

برچسب اپ (app label) همچنان orders است؛ یعنی در migrationها، "orders.Order" و مجوزها همان نام کوتاه به کار می‌رود.

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

  • اگر PowerShell با خطای «running scripts is disabled» جلوی Activate.ps1 را گرفت، یک بار Set-ExecutionPolicy -Scope CurrentUser RemoteSigned را اجرا کنید؛ نیازی به دسترسی ادمین نیست.
  • py -0 فهرست همه‌ی نسخه‌های پایتون نصب‌شده روی ویندوز را نشان می‌دهد؛ با py -3.12 دقیقاً همان نسخه را برای venv انتخاب کنید.
  • بعد از فعال‌سازی venv همیشه python -m pip بنویسید نه فقط pip؛ این‌طور مطمئنید pip همان پایتون venv را نصب می‌کند.
  • در ایران اگر pip کند است یا خطای 403 می‌دهد، می‌توانید با pip config set global.index-url یک میرور داخلی PyPI را برای همیشه تنظیم کنید؛ دیگر لازم نیست هر بار -i بنویسید.
  • startapp پوشه‌ی مقصد را نمی‌سازد؛ اگر apps\orders وجود نداشته باشد خطای «Destination directory does not exist» می‌گیرید.

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