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


تمام فیلدهای مدل در جنگو (مانند 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 = [
    ('d', 'Draft'),
    ('p', 'Published'),
    ('w', 'Withdrawn'),
]

status = models.CharField(max_length=1, choices=STATUS_CHOICES)
 
⚠️ مقدار ذخیره‌شده در پایگاه داده، مقدار اول هر تاپل است ('d'، 'p' و ...).

✺✳ ┅  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
  • کاربرد: تضمین می‌کند که مقدار این فیلد در کل جدول منحصربه‌فرد باشد.

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

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 برای بهبود تجربه کاربری، از جمله بهترین روش‌های توسعه با جنگو محسوب می‌شوند.