
روز ۲۸: فرمها (Forms) در جنگو
فرمها در جنگو یکی از ابزارهای کلیدی برای تعامل کاربران با وبسایت هستند و نقش حیاتی در ثبت داده، ویرایش اطلاعات و اعتبارسنجی ورودیها دارند. جنگو سیستم فرم بسیار قدرتمندی ارائه میدهد که شامل Form کلاسها، ModelForm برای اتصال به مدلها، فیلدهای آماده، اعتبارسنجی داخلی و امکانات سفارشیسازی است. تسلط بر فرمها به توسعهدهنده امکان میدهد رابط کاربری استاندارد، تجربه کاربری روان و امنیت بالا در پردازش دادهها ایجاد کند. فرمها نقطه اتصال بین کاربران و دیتابیس هستند و مدیریت درست آنها برای هر پروژه جنگو حیاتی است.
ایجاد فرم با کلاس Form
سادهترین نوع فرم در جنگو استفاده از کلاس Form است. این فرمها میتوانند شامل فیلدهای متنی، ایمیل، عددی، تاریخ و فایل باشند. فرمهای معمولی برای دادههایی که به مدلها متصل نیستند یا برای پردازش موقت استفاده میشوند کاربرد دارند. تعریف فرمها با کلاس Form بسیار ساده است و میتوان آنها را در View و Template رندر کرد و اعتبارسنجی انجام داد.
from django import forms
class ContactForm(forms.Form):
name = forms.CharField(max_length=100)
email = forms.EmailField()
message = forms.CharField(widget=forms.Textarea)در این مثال، فرم ContactForm شامل سه فیلد name، email و message است. جنگو به صورت خودکار اعتبارسنجی اولیه انجام میدهد و خطاهای مناسب برای کاربر نمایش میدهد.
استفاده از ModelForm برای فرمهای مرتبط با مدلها
وقتی میخواهیم دادههای فرم مستقیماً در مدل ذخیره شوند، ModelForm ابزار مناسب است. این فرمها به صورت خودکار فیلدهای مدل را میخوانند و امکان ذخیره مستقیم دادهها در دیتابیس را فراهم میکنند. ModelForm باعث کاهش کد، افزایش سرعت توسعه و هماهنگی با مدلها میشود و به توسعهدهنده امکان میدهد فرمهای پیچیده را سریع و استاندارد ایجاد کند.
from django.forms import ModelForm
from .models import Article
class ArticleForm(ModelForm):
class Meta:
model = Article
fields = ['title', 'content', 'author']با این ModelForm، دادههای فرم مستقیماً در مدل Article ذخیره میشوند و اعتبارسنجی داخلی مدل نیز اعمال میشود. این روش باعث میشود هماهنگی بین فرم و مدل همواره حفظ شود.
اعتبارسنجی دادهها و فرمهای سفارشی
جنگو امکان اعتبارسنجی سفارشی را نیز ارائه میدهد. میتوانیم متد clean یا clean_<fieldname> را در فرمها تعریف کنیم تا شرایط خاص پروژه رعایت شود. این قابلیت باعث میشود دادههای نامعتبر پیش از ذخیره در دیتابیس شناسایی شوند و پیامهای خطای مناسب به کاربر نمایش داده شود. استفاده درست از اعتبارسنجی سفارشی امنیت دادهها و تجربه کاربری را تضمین میکند.
class SignupForm(UserCreationForm):
email = forms.EmailField(required=True)
def clean_email(self):
email = self.cleaned_data.get('email')
if User.objects.filter(email=email).exists():
raise forms.ValidationError("این ایمیل قبلاً ثبت شده است.")
return emailدر این مثال، فرم ثبتنام بررسی میکند که ایمیل وارد شده قبلاً استفاده نشده باشد و در صورت تکراری بودن، پیام خطای مناسب نمایش داده میشود.
اتصال فرم به View و Template
برای استفاده از فرمها، باید آنها را در View رندر کنیم و دادههای ارسال شده را پردازش کنیم. جنگو امکان مدیریت درخواستهای GET و POST را ساده کرده و با استفاده از Template میتوان فرمها را به صورت HTML نمایش داد. استفاده از CSRF Token امنیت فرمها را تضمین میکند و از حملات متداول جلوگیری میکند.
from django.shortcuts import render, redirect
from .forms import ContactForm
def contact(request):
if request.method == 'POST':
form = ContactForm(request.POST)
if form.is_valid():
# پردازش دادهها، ارسال ایمیل یا ذخیره در دیتابیس
return redirect('success')
else:
form = ContactForm()
return render(request, 'contact.html', {'form': form})در این View، فرم ContactForm پردازش شده و در صورت معتبر بودن، میتوان دادهها را ذخیره یا پردازش کرد. استفاده از redirect باعث بهبود تجربه کاربری و جلوگیری از ارسال مجدد فرم میشود.
طراحی Template فرمها
Template فرمها باید ساده، قابل فهم و کاربرپسند باشند. فیلدها باید با پیامهای خطای واضح نمایش داده شوند و دکمههای ارسال و بازنشانی در دسترس باشند. جنگو امکان رندر فرم به صورت as_p, as_table و as_ul را ارائه میدهد و توسعهدهنده میتواند با CSS آنها را سفارشی کند.
<!-- contact.html -->
<h2>تماس با ما</h2>
<form method="post">
{% csrf_token %}
{{ form.as_p }}
<button type="submit">ارسال</button>
</form>این Template ساده و قابل فهم است و تجربه کاربری استاندارد را فراهم میکند.
جمعبندی روز بیست و هشتم
در روز بیست و هشتم، با فرمها در جنگو آشنا شدیم و یاد گرفتیم چگونه با استفاده از کلاس Form و ModelForm فرمهای استاندارد و سفارشی ایجاد کنیم، اعتبارسنجی داخلی و سفارشی دادهها را اعمال کنیم، فرمها را در View رندر کنیم و دادههای ارسال شده را پردازش کنیم. همچنین طراحی Template مناسب برای فرمها بررسی شد تا تجربه کاربری روان و حرفهای ایجاد شود. تسلط بر فرمها پایهای محکم برای تعامل کاربران با سایت، ثبت دادهها، مدیریت پروفایل، ثبت مقالات و هر عملیاتی که نیاز به ورود اطلاعات دارد، فراهم میکند و مهارتهای شما در توسعه اپلیکیشنهای تعاملی جنگو را به شکل قابل توجهی افزایش میدهد.