فرم ها در جنگو
در جنگو، فرمها (Forms) یکی از اجزای اصلی برای دریافت دادهها از کاربران و پردازش آنها به صورت ایمن و مؤثر هستند. فرمها به شما این امکان را میدهند که ورودیهای کاربر را از طریق HTML دریافت کنید، آنها را اعتبارسنجی کنید، و در نهایت دادهها را به مدلها یا سایر قسمتهای پروژه منتقل کنید.
۱. تعریف فرمها در جنگو
در جنگو، فرمها میتوانند به صورت دستی یا با استفاده از کلاسهای خاص فرم جنگو تعریف شوند. برای تعریف فرمها، معمولا از کلاس forms.Form استفاده میشود که در آن میتوانید فیلدهای مختلف فرم را تعریف کنید.
ساختار یک فرم ساده:
-
تعریف فرم: برای تعریف یک فرم در جنگو، باید کلاس فرم را از django.forms.Form ارثبری کنید و فیلدهای فرم را به عنوان ویژگیهای کلاس مشخص کنید.
مثال:
from django import forms
class ContactForm(forms.Form):
name = forms.CharField(max_length=100)
email = forms.EmailField()
message = forms.CharField(widget=forms.Textarea)در این مثال:
- name: فیلدی از نوع CharField برای دریافت نام.
- email: فیلدی از نوع EmailField برای دریافت ایمیل.
- message: فیلدی از نوع CharField که به صورت یک جعبه متنی (textarea) نمایش داده میشود.
-
استفاده از فرم در ویوها: پس از تعریف فرم، میتوانید از آن در ویوها برای پردازش دادهها استفاده کنید.
مثال:
from django.shortcuts import render
from .forms import ContactForm
def contact_view(request):
if request.method == 'POST':
form = ContactForm(request.POST)
if form.is_valid():
# پردازش دادهها (مثلاً ذخیره در دیتابیس یا ارسال ایمیل)
name = form.cleaned_data['name']
email = form.cleaned_data['email']
message = form.cleaned_data['message']
return render(request, 'thank_you.html', {'name': name})
else:
form = ContactForm()
return render(request, 'contact.html', {'form': form})در اینجا:
- وقتی که درخواست به صورت POST باشد، دادههای فرم از request.POST دریافت میشوند.
- form.is_valid() برای اعتبارسنجی دادهها استفاده میشود.
- پس از اعتبارسنجی صحیح، دادههای تمیز شده (cleaned_data) به دست آمده و میتوانید آنها را پردازش کنید.
-
رندر فرم در قالب (Template): پس از ارسال فرم از ویو به قالب، در قالب میتوانید از تگهای خاص جنگو برای نمایش فرم استفاده کنید.
مثال:
<form method="post">
{% csrf_token %}
{{ form.as_p }}
<button type="submit">Send Message</button>
</form>در اینجا:
- {{ form.as_p }} فرم را به صورت پاراگرافی نمایش میدهد.
- csrf_token برای جلوگیری از حملات CSRF در فرمها ضروری است.
۲. انواع فیلدهای فرم در جنگو
در جنگو، شما میتوانید انواع مختلف فیلدها را برای دریافت دادههای مختلف از کاربر استفاده کنید. برخی از رایجترین فیلدهای فرم عبارتند از:
-
CharField: برای دریافت رشتههای متنی.
name = forms.CharField(max_length=100) -
EmailField: برای دریافت ایمیل.
email = forms.EmailField() -
IntegerField: برای دریافت اعداد صحیح.
age = forms.IntegerField() -
DateField: برای دریافت تاریخ.
birth_date = forms.DateField(widget=forms.SelectDateWidget) -
BooleanField: برای دریافت مقدار صحیح/غلط (True/False).
subscribe = forms.BooleanField(required=False) -
ChoiceField: برای دریافت گزینهای از بین چند انتخاب.
GENDER_CHOICES = [('M', 'Male'), ('F', 'Female')]
gender = forms.ChoiceField(choices=GENDER_CHOICES) -
FileField: برای بارگذاری فایل.
file = forms.FileField() -
ModelChoiceField: برای انتخاب یک مدل از پایگاه داده.
from .models import Author
author = forms.ModelChoiceField(queryset=Author.objects.all())
۳. اعتبارسنجی فرمها
یکی از ویژگیهای قدرتمند فرمها در جنگو، اعتبارسنجی دادههای ورودی است. جنگو به طور خودکار برخی از اعتبارسنجیها را انجام میدهد (مثلاً بررسی نوع داده در فیلدهای EmailField)، اما میتوانید اعتبارسنجیهای سفارشی نیز اضافه کنید.
اعتبارسنجی داخلی:
- جنگو به صورت خودکار فیلدها را بر اساس نوع دادهها اعتبارسنجی میکند (مثلاً IntegerField فقط اعداد صحیح میپذیرد).
اعتبارسنجی سفارشی:
برای اضافه کردن اعتبارسنجی سفارشی، میتوانید متد clean_<field_name>() را در فرم خود تعریف کنید.
مثال:
name = forms.CharField(max_length=100)
email = forms.EmailField()
message = forms.CharField(widget=forms.Textarea)
def clean_name(self):
name = self.cleaned_data['name']
if len(name) < 3:
raise forms.ValidationError("Name must be at least 3 characters long.")
return name
در اینجا:
- متد clean_name() به شما این امکان را میدهد که یک اعتبارسنجی سفارشی برای فیلد name اعمال کنید.
اعتبارسنجی فرم:
برای اعتبارسنجی کل فرم (نه فقط یک فیلد خاص)، میتوانید متد clean() را در فرم خود تعریف کنید.
مثال:
name = forms.CharField(max_length=100)
email = forms.EmailField()
message = forms.CharField(widget=forms.Textarea)
def clean(self):
cleaned_data = super().clean()
name = cleaned_data.get('name')
email = cleaned_data.get('email')
if name == email:
raise forms.ValidationError("Name and email cannot be the same.")
return cleaned_data
۴. فرمهای مدل (Model Forms)
در جنگو، میتوانید فرمها را به طور خودکار از مدلهای پایگاه داده تولید کنید. این نوع فرمها به نام Model Forms شناخته میشوند و به شما این امکان را میدهند که فرمهایی برای ایجاد، ویرایش و حذف رکوردهای مدلها بسازید.
تعریف یک مدل فرم:
فرض کنید یک مدل به نام Book داریم:
class Book(models.Model):
title = models.CharField(max_length=100)
author = models.CharField(max_length=100)
published_date = models.DateField()
حالا میتوانیم یک فرم مدل برای این مدل تعریف کنیم:
from .models import Book
class BookForm(forms.ModelForm):
class Meta:
model = Book
fields = ['title', 'author', 'published_date']
در اینجا:
- BookForm یک فرم مدل است که به طور خودکار فیلدها و اعتبارسنجیهای لازم را برای مدل Book تولید میکند.
استفاده از فرم مدل در ویو:
from .forms import BookForm
def book_create_view(request):
if request.method == 'POST':
form = BookForm(request.POST)
if form.is_valid():
form.save() # ذخیره دادهها در پایگاه داده
return redirect('book_list')
else:
form = BookForm()
return render(request, 'book_create.html', {'form': form})
۵. استفاده از ویجتها (Widgets) برای کنترل نمای فرمها
ویجتها در جنگو به شما این امکان را میدهند که نحوه نمایش فیلدهای فرم را تغییر دهید. به طور پیشفرض، هر فیلد فرم یک ویجت خاص خود دارد، اما شما میتوانید ویجتها را تغییر دهید تا فرمها به شکلی متفاوت نمایش داده شوند.
تغییر ویجتها:
مثال:
name = forms.CharField(widget=forms.TextInput(attrs={'placeholder': 'Your Name'}))
email = forms.EmailField(widget=forms.EmailInput(attrs={'placeholder': 'Your Email'}))
در اینجا:
- ویجت TextInput برای فیلد name و ویجت EmailInput برای فیلد email با ویژگیهای خاص تنظیم شدهاند.
نتیجهگیری
- فرمها در جنگو ابزاری برای دریافت دادهها از کاربران و اعتبارسنجی آنها هستند.
- با استفاده از فرمهای مدل، میتوانید فرمهایی برای تعامل با دادههای پایگاه داده ایجاد کنید.
- فرمها قابلیتهای قدرتمندی مانند اعتبارسنجی سفارشی و ویجتها برای کنترل نحوه نمایش دادهها را فراهم میکنند.
