
روز ۲۹: ModelForm و اعتبارسنجی دادهها در جنگو
یکی از مهمترین ابزارهای جنگو برای کار با فرمها و مدلها، کلاس ModelForm است که ارتباط مستقیم بین فرم و مدل دیتابیس برقرار میکند. استفاده از ModelForm باعث میشود شما بدون نوشتن کد اضافی فرمهایی بسازید که دقیقاً مطابق با فیلدهای مدل شما عمل کنند و قابلیت ذخیره دادهها در دیتابیس را به سادهترین شکل ممکن فراهم کنند. ModelForm نه تنها سرعت توسعه را افزایش میدهد، بلکه باعث میشود فرمها همیشه با تغییرات مدل هماهنگ باشند و نیاز به نوشتن کد تکراری کاهش یابد. در پروژههای واقعی، ModelForm پایهای برای ساخت فرمهای ثبت مقاله، پروفایل کاربری، فرمهای تماس و هر فرم تعاملی دیگری است.
ایجاد ModelForm برای مدلها
برای ایجاد یک ModelForm کافی است یک کلاس جدید تعریف کرده و آن را از ModelForm ارثبری کنیم و سپس متا کلاس را مشخص کنیم تا مدل و فیلدهای موردنظر فرم شناسایی شوند. این روش باعث میشود هر فیلد مدل به صورت خودکار در فرم نمایش داده شود و امکان افزودن فیلدهای سفارشی نیز وجود داشته باشد.
from django.forms import ModelForm
from .models import Article
class ArticleForm(ModelForm):
class Meta:
model = Article
fields = ['title', 'content', 'author']در این مثال، فرم ArticleForm شامل سه فیلد title، content و author است و دادههای ارسال شده مستقیماً در مدل Article ذخیره میشوند. این فرم پایهای امن و استاندارد برای ثبت مقالات فراهم میکند.
اعتبارسنجی داخلی فرمها
جنگو به صورت خودکار اعتبارسنجی داخلی برای فرمهای ModelForm انجام میدهد. این اعتبارسنجی شامل بررسی فیلدهای اجباری، نوع داده، محدودیت طول و ویژگیهای تعریف شده در مدل است. به این ترتیب، دادههای غیرمعتبر قبل از ذخیره در دیتابیس شناسایی میشوند و از ورود اطلاعات نامناسب جلوگیری میشود. استفاده از اعتبارسنجی داخلی امنیت دادهها را تضمین کرده و تجربه کاربری استاندارد ایجاد میکند.
اعتبارسنجی سفارشی دادهها
علاوه بر اعتبارسنجی داخلی، میتوانیم اعتبارسنجی سفارشی برای فیلدها و فرمها اضافه کنیم تا شرایط خاص پروژه رعایت شود. برای این کار از متد clean یا clean_<fieldname> استفاده میکنیم. این قابلیت به توسعهدهنده اجازه میدهد قوانین خاص خود را برای هر فرم تعریف کند و پیامهای خطای مناسب برای کاربر نمایش دهد.
class ArticleForm(ModelForm):
class Meta:
model = Article
fields = ['title', 'content', 'author']
def clean_title(self):
title = self.cleaned_data.get('title')
if "Django" not in title:
raise forms.ValidationError("عنوان مقاله باید شامل کلمه 'Django' باشد.")
return titleدر این مثال، فرم بررسی میکند که عنوان مقاله حتماً شامل کلمه جنگو باشد و در غیر این صورت خطای مناسب نمایش داده میشود. این روش امکان اجرای قوانین کسبوکار خاص را فراهم میکند و اطمینان میدهد دادهها با استانداردهای پروژه همخوانی دارند.
اتصال ModelForm به View
برای استفاده از ModelForm، باید آن را در View رندر کنیم و دادههای ارسال شده توسط کاربر را پردازش کنیم. جنگو به صورت خودکار امکان پردازش دادههای POST و نمایش خطاهای فرم را فراهم میکند. استفاده از ModelForm در View باعث سادهتر شدن مدیریت دادهها و هماهنگی با مدل میشود.
from django.shortcuts import render, redirect
from .forms import ArticleForm
def create_article(request):
if request.method == 'POST':
form = ArticleForm(request.POST)
if form.is_valid():
form.save()
return redirect('article_list')
else:
form = ArticleForm()
return render(request, 'create_article.html', {'form': form})در این View، فرم ArticleForm رندر میشود و در صورت معتبر بودن دادهها، مقاله در دیتابیس ذخیره شده و کاربر به صفحه لیست مقالات منتقل میشود. این روش تجربه کاربری روان و استاندارد ایجاد میکند.
طراحی Template فرمها
Template فرمهای ModelForm باید ساده و قابل فهم باشند و امکان نمایش پیامهای خطا به صورت واضح فراهم شود. جنگو امکان رندر فرمها به صورت as_p, as_table و as_ul را ارائه میدهد و توسعهدهنده میتواند با CSS ظاهر فرمها را سفارشی کند. استفاده از CSRF Token امنیت فرمها را تضمین میکند و از حملات متداول جلوگیری میکند.
<!-- create_article.html -->
<h2>ایجاد مقاله جدید</h2>
<form method="post">
{% csrf_token %}
{{ form.as_p }}
<button type="submit">ثبت مقاله</button>
</form>این Template ساده و کاربرپسند است و تجربه کاربری استاندارد را برای ایجاد مقاله فراهم میکند.
جمعبندی روز بیست و نهم
در روز بیست و نهم با ModelForm و اعتبارسنجی دادهها در جنگو آشنا شدیم. یاد گرفتیم چگونه فرمها را به مدلها متصل کنیم، اعتبارسنجی داخلی و سفارشی انجام دهیم، فرمها را در View پردازش کنیم و Template مناسب برای نمایش فرمها طراحی کنیم. تسلط بر ModelForm باعث میشود توسعه فرمها سریع، امن و استاندارد انجام شود و تجربه کاربری حرفهای فراهم گردد. این مهارت برای ثبت دادهها، ویرایش اطلاعات، سیستم کاربران، پروژههای تعاملی و هر عملیاتی که نیاز به ورود داده دارد، پایهای ضروری محسوب میشود و توسعهدهندگان را قادر میسازد سیستمهای قابل اعتماد و حرفهای بسازند.