تمام فیلدهای مدل در جنگو (مانند 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_name → Full name) به عنوان نام پیشفرض استفاده میکند.
این گزینهها، ابزارهای قدرتمندی هستند که امکان طراحی مدلهایی دقیق، ایمن و کاربرپسند را فراهم میآورند. درک تفاوت بین null و blank، استفاده صحیح از choices و default، و بهکارگیری verbose_name برای بهبود تجربه کاربری، از جمله بهترین روشهای توسعه با جنگو محسوب میشوند.