پارامترهای فیلد


در فریم‌ورک جنگو، هر فیلد مدل (Model Field) نه تنها نوع داده‌ای که ذخیره می‌کند را مشخص می‌کند، بلکه می‌تواند دارای مجموعه‌ای از گزینه‌ها (Field Options) باشد که رفتار آن فیلد را در سطح پایگاه داده، فرم‌ها، اعتبارسنجی و ORM کنترل می‌کنند.

این گزینه‌ها به دو دسته تقسیم می‌شوند:

  1. گزینه‌های خاص هر نوع فیلد — مانند max_length در CharField که برای آن فیلد اجباری یا اختیاری است.
  2. گزینه‌های مشترک بین تمام فیلدها — که برای هر فیلدی قابل استفاده هستند و رفتار کلی فیلد را تغییر می‌دهند.

پارامترهای مشترک


تمام فیلدهای مدل در جنگو (مانند CharField، IntegerField، ForeignKey و غیره) از مجموعه‌ای از پارامترهای مشترک پشتیبانی می‌کنند. این گزینه‌ها رفتار فیلد را در سطح پایگاه داده، فرم‌ها، اعتبارسنجی و رابط کاربری ادمین کنترل می‌کنند. در ادامه، پرکاربردترین و مهم‌ترین این گزینه‌ها را بررسی می‌کنیم.

✺✳ ┅  null  ┅ ✳✺
  • نوع: bool
  • پیش‌فرض: False
  • کاربرد: تعیین می‌کند که آیا فیلد می‌تواند در پایگاه داده مقدار NULL را بپذیرد یا خیر.

اگر null=True باشد، جنگو اجازه می‌دهد که این فیلد در پایگاه داده مقدار NULL را بپذیرد. در غیر این صورت، فیلد اجباری در سطح پایگاه داده قلمداد خواهد شد و هر تلاشی برای ذخیره NULL منجر به خطا می‌شود.

age = models.IntegerField(null=True)
⚠️ برای فیلدهای متنی (CharField، TextField) معمولا از null=True استفاده نمی‌گردد. به جای آن، از blank=True و ذخیره رشتهٔ خالی ('') استفاده می‌شود. چرا که در پایگاه داده، NULL و رشته خالی دو مفهوم متفاوت هستند و ترکیب آن‌ها می‌تواند منجر به پیچیدگی در کوئری‌ها گردد و استاندارد جنگو پیشنهاد می‌کند برای فیلدهای متنی، فقط از رشته خالی استفاده شود.

✺✳ ┅  blank  ┅ ✳✺
  • نوع: bool
  • پیش‌فرض: False
  • کاربرد: تعیین می‌کند که آیا فیلد می‌تواند در فرم‌ها (و اعتبارسنجی جنگو) خالی باقی بماند یا خیر.

اگر blank=True باشد، فیلد در فرم‌های جنگو (از جمله ModelForm و پنل ادمین) اختیاری در نظر گرفته می‌شود و کاربر می‌تواند آن را خالی بگذارد و در غیر این‌صورت جنگو اجازه Submit فرم را تا زمان پرکردن فیلد به کاربر نخواهد داد.

bio = models.TextField(blank=True)
 
⚠️ تفاوت null و  blank در این است که null مربوط به ذخیره‌سازی در پایگاه داده است ولی blank مربوط به اعتبارسنجی فرم است. این دو گزینه مستقل هستند و معمولاً هنگامی که یک فیلد هم در فرم اختیاری است و هم می‌تواند NULL باشد، هر دو را فعال می‌کنند.
 

✺✳ ┅  choices  ┅ ✳✺
  • نوع: Iterable (مثل لیست یا تاپل)
  • کاربرد: محدود کردن مقادیر مجاز یک فیلد به یک مجموعه از گزینه‌های از پیش تعریف‌شده.

در ادمین پنل و فرم‌ها، این فیلد به صورت Select و options نمایش داده می‌شود.

STATUS_CHOICES = [
    ('ON', 'Active'),
    ('OFF', 'Inactive'),
    ('IDL', 'Idle'),
]

status = models.CharField(max_length=1, choices=STATUS_CHOICES)
 
⚠️ مقدار ذخیره‌شده در پایگاه داده، مقدار اول هر تاپل است (OFF، ON و IDL)  اما مقدار نمایش داده شده در فرم‌ها و پنل ادمین، مقدار دوم هر تاپل خواهد بود ( Inactive، Active و Idle )

✺✳ ┅  default  ┅ ✳✺
  • نوع: هر مقدار ثابت یا یک تابع قابل فراخوانی (callable)
  • کاربرد: تعیین مقدار پیش‌فرض برای فیلد در صورتی که مقداری ارسال نشود.
active = models.BooleanField(default=True)

✺✳ ┅  help_text  ┅ ✳✺
  • نوع: str
  • کاربرد: نمایش یک متن راهنما در کنار فیلد در فرم‌ها.
email = models.EmailField(help_text="Enter your valid mail address ...")
 ⚠️ این متن در HTML فرم‌ها به صورت <span class="helptext">...</span> رندر می‌شود و برای کاربران در رابط کاربری مفید بوده و در پایگاه داده تاثیری ندارد. 

✺✳ ┅  primary_key  ┅ ✳✺
  • نوع: bool
  • پیش‌فرض: False
  • کاربرد: مشخص می‌کند که آیا این فیلد کلید اصلی (Primary Key) مدل باشد.

اگر primary_key=True باشد، این فیلد به عنوان کلید اصلی مدل در نظر گرفته می‌شود.

id = models.UUIDField(primary_key=True, default=uuid.uuid4)
 

⚠️ هر مدل فقط یک فیلد می‌تواند primary_key=True داشته باشد.

⚠️ اگر هیچ فیلدی به عنوان primary_key تعریف نشود، جنگو به‌صورت خودکار یک فیلد id از نوع AutoField اضافه می‌کند.


✺✳ ┅  unique  ┅ ✳✺
  • نوع: bool
  • پیش‌فرض: False
  • کاربرد: تضمین می‌کند که مقدار این فیلد در کل جدول منحصربه‌فرد باشد.
email = models.EmailField(unique=True)
 

⚠️ در پایگاه داده، یک محدودیت انحصاری از نوع UNIQUE ایجاد می‌شود.

⚠️ در صورت تلاش برای ذخیره مقدار تکراری، خطای IntegrityError رخ می‌دهد.


✺✳ ┅  editable  ┅ ✳✺
  • نوع: bool
  • پیش‌فرض: True
  • کاربرد: تعیین می‌کند که آیا این فیلد در فرم‌های خودکار جنگو (مثل ادمین پنل یا ModelForm) نمایش داده شود یا خیر.

اگر editable=False باشد، این فیلد در فرم‌های جنگو نمایش داده نخواهد شد.

id = models.UUIDField(primary_key=True, editable=False, default=uuid.uuid4)
 

⚠️ فیلدهای editable=False در پنل ادمین دیده نمی‌شوند و در فرم‌ها نیز شامل نمی‌شوند. اما همچنان در مدل و پایگاه داده وجود دارند و قابل دسترسی هستند.


✺✳ ┅  verbose_name  ┅ ✳✺
  • نوع: str
  • کاربرد: تعیین نام خوانا و انسان‌محور برای فیلد (به جای نام متغیر).

در ادمین پنل و فرم‌ها، نامی که برای verbose_name تعیین می‌شود به عنوان جایگزینی نام فیلد، نمایش داده خواهد شد.

full_name = models.CharField("name", max_length=50)
full_name = models.CharField(max_length=50, verbose_name="name")
 

⚠️ اگر verbose_name تعیین نگردد، جنگو، نام فیلد را با تبدیل _ به فاصله و و بزرگ‌نویسی اول هر کلمه (full_nameFull name) به عنوان نام پیش‌فرض استفاده می‌کند.


 

این گزینه‌ها، ابزارهای قدرتمندی هستند که امکان طراحی مدل‌هایی دقیق، ایمن و کاربرپسند را فراهم می‌آورند. درک تفاوت بین null و blank، استفاده صحیح از choices و default، و به‌کارگیری verbose_name برای بهبود تجربه کاربری، از جمله بهترین روش‌های توسعه با جنگو محسوب می‌شوند.

پارامترهای خاص


علاوه بر پارامترهای مشترکی مانند null، blank و default که در بخش قبلی بررسی شدند، هر کدام از تایپ‌های فیلد در جنگو ممکن است گزینه‌های اختصاصی خود را نیز داشته باشد. و یا به عبارت دیگر، برخی گزینه‌ها فقط برای فیلدهای خاصی معنا دارند و در تعریف آن فیلدها کاربرد دارند. برخی از این گزینه‌ها اجباری هستند (مثل max_length در CharField) و برخی دیگر اختیاری اما مفید.. در ادامه، مهم‌ترین فیلدهای پرکاربرد و گزینه‌های خاص آن‌ها را مرور می‌کنیم.

 

✺✳ ┅  max_length  ┅ ✳✺
  • نوعint
  • فیلدها: CharField, EmailField, SlugField, URLField, FileField, ImageField
  • اجباری: برای CharField و زیرمجموعه‌هایش
  • کاربرد: حداکثر تعداد کاراکترهای مجاز برای فیلد را تعیین می‌کند. در پایگاه داده، این مقدار به عنوان اندازه ستون VARCHAR(n) استفاده می‌شود.
username = models.CharField(max_length=150)
website = models.URLField(max_length=500)
 

⚠️ برای FileField و ImageField، این گزینه حداکثر طول مسیر ذخیره‌سازی فایل (path) را تعیین می‌کند و نه حجم فایل. 


✺✳ ┅  max_digits  و decimal_places ┅ ✳✺
  • نوعint
  • فیلدها: DecimalField
  • اجباری: برای DecimalField
  • کاربرد: max_digits حداکثر تعداد ارقام مجاز (شامل ارقام قبل و بعد از ممیز) را مشخص کرده و decimal_places تعداد ارقام پس از ممیز را تعیین می‌کند.
price = models.DecimalField(max_digits=10, decimal_places=2)  # e.g. 12345678.99

⚠️ هر دو گزینه برای DecimalField اجباری هستند و max_digits باید حتما بزرگتر از decimal_places باشد.


 ✺✳ ┅  auto_now  و auto_now_add ┅ ✳✺
  • نوعbool
  • پیش‌فرض: False
  • فیلدها: DateField, DateTimeField
  • اختیاری
  • کاربرد: اگر True باشد، در auto_now هر بار که یک رکورد ویرایش شده و ذخیره گردد، به زمان فعلی، بروزرسانی می‌شود و برای ثبت زمان آخرین ویرایش (updated_at) کاربرد دارد، ولی در auto_now_add فقط هنگام ایجاد اولیه رکورد به زمان فعلی تنظیم شده و برای ثبت زمان ایجاد (created_at) بیشترین کاربرد را خواهد داشت
updated_at = models.DateTimeField(auto_now=True)
created_at = models.DateTimeField(auto_now_add=True)
 ⚠️ در صورت استفاده از auto_now=True و یا auto_now_add=True، فیلد به‌صورت خودکار editable=False خواهد بود.

✺✳ ┅  on_delete  ┅ ✳✺
  • نوعmodels
  • فیلدها: ForeignKey, OneToOneField, ManyToManyField
  • اجباری: برای فیلدهای رابطه‌ای
  • کاربرد: رفتار سیستم را هنگام حذف رکورد مقصد (related object) تعیین می‌کند.
  • مقادیر رایج:

    • models.CASCADE: حذف تمامی زنجیره‌‌ی رکوردهای وابسته.
    • models.PROTECT: جلوگیری از حذف با خطای ProtectedError.
    • models.SET_NULL: تنظیم فیلد به NULL (نیاز به null=True دارد).
    • models.SET_DEFAULT: تنظیم به مقدار پیش‌فرض (نیاز به default دارد).
author = models.ForeignKey(User, on_delete=models.CASCADE)

✺✳ ┅  related_name  ┅ ✳✺
  • نوعstr
  • فیلدها: ForeignKey, OneToOneField, ManyToManyField
  • اختباری
  • کاربرد: نامی که برای دسترسی معکوس از مدل مقصد به مدل مبدا استفاده می‌شود
class Article(models.Model):
    author = models.ForeignKey(User, on_delete=models.CASCADE, related_name='articles')
 ⚠️ اگر related_name='+' باشد، دسترسی معکوس غیرفعال می‌شود.

  ✺✳ ┅  allow_unicode  ┅ ✳✺
  • نوعbool
  • فیلدها: SlugField
  • اختیاری
  • کاربرد: اگر True باشد، اجازه استفاده از کاراکترهای غیر-لاتین (مثل فارسی، عربی، چینی) در اسلاگ را می‌دهد.

 

slug = models.SlugField(allow_unicode=True)  # "مقاله-سلام-دنیا"