از طریق منوی جستجو مطلب مورد نظر خود در وبلاگ را به سرعت پیدا کنید
روش استفاده از فرم های جنگو: ایجاد، رندر و مدیریت فرم ها
سرفصلهای مطلب
سیستم مدیریت فرم های جنگو از کلاس های پایتون برای نمایش فرم ها به عنوان اشیا استفاده می کند. این فرمها را میتوان در قالبها ارائه کرد، اعتبارسنجی کرد و تنها با استفاده از چند خط کد پردازش کرد.
در این مقاله، روش ایجاد فرم ها، مدیریت فرم های ارسالی و استفاده از مجموعه فرم های جنگو را خواهید آموخت.
ایجاد فرم ها در جنگو
شما می توانید فرم ها را به صورت دستی در جنگو ایجاد کنید را فرم کلاس یا به صورت خودکار تولید می شود از مدل های استفاده شده ModelForm.
برای ایجاد یک فرم در جنگو، یک کلاس فرم در خود تعریف کنید فرم هاpy فایل این کلاس فیلدهای فرم و قوانین اعتبارسنجی را به طور موثر مشخص می کند process ورودی کاربر
ایجاد فرم ها به صورت دستی با forms.Form
در اینجا نمونه ای از ایجاد یک فرم تماس ساده به صورت دستی آورده شده است:
# forms.py from django import forms class ContactForm(forms.Form): name = forms.CharField(max_length=100, label="Your Name") email = forms.EmailField(label="Your Email") message = forms.CharField(widget=forms.Textarea, label="Your Message")
این فرم شامل سه فیلد است: نام، ایمیل، و پیام. هر فیلد با استفاده از کلاس های فیلد فرم جنگو تعریف می شود:
- CharField برای ورودی های متن کوتاه مانند نام.
- فیلد ایمیل برای اعتبار سنجی ایمیل
- CharField با ویجت Textarea برای ورودی های متن طولانی تر، مانند پیام ها.
ایجاد فرم ها از مدل ها با استفاده از ModelForm
در بسیاری از موارد، فرم ها به مدل ها گره خورده اند. جنگو این کار را با اجازه دادن به شما برای ایجاد فرمها مستقیماً از مدلهای استفاده شده ساده میکند ModelForm. این باعث صرفه جویی در زمان با تولید خودکار فیلدهای فرم بر اساس می شود روی زمینه های مدل
- ایجاد فرم ModelForm:
اگر شما یک ارسال کنید مدل در شما مدل هاpy فایل:
# models.py from django.db import models class Post(models.Model): title = models.CharField(max_length=200) content = models.TextField() created_at = models.DateTimeField(auto_now_add=True)
می توانید یک فرم برای این مدل به صورت زیر ایجاد کنید:
# forms.py from django import forms from .models import Post class PostForm(forms.ModelForm): class Meta: model = Post fields = ['title', 'content']
- استفاده از فرم ModelForm در نما:
در مرحله بعد، از فرم در نمای جنگو به صورت زیر استفاده کنید:
# views.py from django.shortcuts import render from .forms import PostForm def create_post(request): if request.method == 'POST': form = PostForm(request.POST) if form.is_valid(): form.save() # Saves the form data to the database return redirect('post_list') # Redirect to a list of posts else: form = PostForm() return render(request, 'create_post.html', {'form': form})
با ModelForm، جنگو به طور خودکار فیلدهای فرم را ایجاد می کند روی فیلدها و دسته های مدل، فرم را با حداقل کد دیگ بخار در پایگاه داده ذخیره می کنند.
رندر کردن فرم ها در قالب های جنگو
برای نمایش فرم روی یک صفحه وب، باید آن را در قالب ارائه دهید. جنگو دو رویکرد ارائه می دهد: با استفاده از کمک کننده های رندر داخلی یا رندر کردن فرم به صورت دستی با HTML.
رندر ساده با توابع کمکی
توابع کمکی داخلی جنگو، سفارشی کردن روش نمایش فرم ها در قالب ها را آسان می کند. سه روش برای ارائه یک فرم با ساختارهای مختلف وجود دارد:
- form.as_p – هر فیلد فرم را در یک می پیچد برچسب، ایده آل برای یک ظاهر طراحی سریع و تمیز.
- form.as_table – فیلدهای فرم را در یک جدول HTML نمایش می دهد که برای طرح بندی های ساخت یافته مفید است.
- form.as_ul – هر فیلد را در آن قرار می دهد برچسب ها برای قالب بندی به سبک لیست.
در اینجا یک مثال از استفاده است form.as_table:
<form method="post"> {% csrf_token %} {{ form.as_table }} <button type="submit">Submit</button> </form>
- {% csrf_token %} – یک توکن CSRF را برای محافظت در برابر حملات جعل درخواست بین سایتی اضافه می کند. این برای فرم هایی که استفاده می کنند لازم است ارسال کنید تسلیم
رندر سفارشی با HTML
به جای استفاده از روش های کمکی جنگو مانند form.as_p، می توانید مستقیماً با استفاده از نام هر فیلد، مانند فرم.نام. این زمانی ایده آل است که شما نیاز به ادغام فرم ها در یک ساختار HTML سفارشی طراحی شده یا اعمال یک ظاهر طراحی پیشرفته CSS دارید.
در زیر نمونه ای از طرح بندی کامل HTML سفارشی آورده شده است:
<form method="post" action="/submit-form/"> {% csrf_token %} <div class="form-group"> <label for="id_name">Name</label> <input type="text" id="id_name" name="name" class="form-control" value="{{ form.name.value|default:'' }}"> {% for error in form.name.errors %} <div class="error">{{ error }}</div> {% endfor %} </div> <div class="form-group"> <label for="id_email">Email</label> {{ form.email }} {% for error in form.email.errors %} <div class="error">{{ error }}</div> {% endfor %} </div> <div class="form-group"> <label for="id_message">Message</label> {{ form.message }} {% for error in form.message.errors %} <div class="error">{{ error }}</div> {% endfor %} </div> <button type="submit" class="btn btn-primary">Send Message</button> </form>
میتوانید از ویجتهای جنگو برای اضافه کردن کلاسها یا ویژگیهای CSS برای تشکیل فیلدها به طور مستقیم در خود استفاده کنید فرم هاpy، به عنوان مثال:
from django import forms class ContactForm(forms.Form): name = forms.CharField(widget=forms.TextInput(attrs={'class': 'form-control'})) email = forms.EmailField(widget=forms.EmailInput(attrs={'class': 'form-control'})) message = forms.CharField(widget=forms.Textarea(attrs={'class': 'form-control'}))
سپس در قالب خود:
<form method="post"> {% csrf_token %} {{ form.name }} {{ form.email }} {{ form.message }} <button type="submit">Submit</button> </form>
رسیدگی به فرم های ارسالی در نماهای جنگو
فرم های جنگو شامل اعتبار سنجی داخلی است تا اطمینان حاصل شود که داده های ارسالی صحیح و ایمن هستند. به عنوان مثال، فیلد ایمیل به طور خودکار ورودی را تأیید می کند تا مطمئن شود که در قالب ایمیل معتبر است.
همچنین می توانید قوانین اعتبارسنجی سفارشی را برای رسیدگی به نیازهای خاص تر، با استفاده از اعتبارسنجی سطح فیلد یا سطح فرم تعریف کنید.
اعتبار سنجی و پردازش فرم ها
اعتبار سنجی داخلی
جنگو اعتبار سنجی فرم را با انجام بررسی های داخلی به صورت خودکار ساده می کند. در اینجا دو مکانیسم اعتبار سنجی کلیدی وجود دارد:
- فیلدهای مورد نیاز – به طور پیشفرض، جنگو به تمام فیلدهای فرم نیاز دارد که ورودی داشته باشند، مگر اینکه به صراحت روی آن تنظیم شده باشد الزامی = نادرست. این تضمین می کند که فیلدهای بحرانی خالی نمانند.
- انواع میدان – جنگو بر اساس انواع ورودی اعتبار سنجی می کند روی تعریف میدان به عنوان مثال:
- فیلد ایمیل آدرس ایمیل معتبر را بررسی می کند.
- IntegerField اطمینان حاصل می کند که ورودی یک عدد صحیح معتبر است.
- URLField تأیید می کند که ورودی یک URL با قالب بندی مناسب است.
اعتبار سنجی سفارشی
جنگو به شما امکان می دهد منطق اعتبار سنجی سفارشی را برای اعمال قوانین خاصی که توسط اعتبار سنجی داخلی آن پوشش داده نمی شود تعریف کنید:
- اعتبار سنجی در سطح زمینه – a را تعریف کنید clean_
() روشی برای اعتبار سنجی سفارشی یک فیلد خاص - اعتبار سنجی در سطح فرم – نادیده گرفتن تمیز () روشی برای اعمال منطق که چندین فیلد یا قوانین کلی را در نظر می گیرد.
به عنوان مثال، برای افزودن یک اعتبارسنجی فیلد سفارشی برای نام زمینه:
from django import forms from django.core.exceptions import ValidationError class ContactForm(forms.Form): name = forms.CharField(max_length=100, label="Your Name") email = forms.EmailField(label="Your Email") message = forms.CharField(widget=forms.Textarea, label="Your Message") def clean_name(self): name = self.cleaned_data.get('name') if "spam" in name.lower(): raise ValidationError("Invalid name: 'spam' is not allowed.") return name
اینجا، clean_name() روش بررسی می کند که آیا نام فیلد حاوی کلمه است هرزنامه (بدون حساسیت به حروف کوچک و بزرگ). اگر این کار را کرد، جنگو a را بلند می کند خطای اعتبارسنجی.
این خطا پس از ارائه مجدد فرم به کاربر نمایش داده می شود.
سفارشی کردن نمایش خطای فرم
می توانید روش نمایش خطاهای فرم در قالب ها را سفارشی کنید. جنگو بهطور خودکار پیامهای خطا را با فیلدهای مربوطه مرتبط میکند، و میتوانید به صورت دستی آنها را در قالبهای خود برای کنترل بیشتر بر طرحبندی به این صورت رندر کنید:
<form method="post"> {% csrf_token %} <div> {{ form.name.label_tag }} {{ form.name }} {% if form.name.errors %} <div class="error">{{ form.name.errors }}</div> {% endif %} </div> <div> {{ form.email.label_tag }} {{ form.email }} {% if form.email.errors %} <div class="error">{{ form.email.errors }}</div> {% endif %} </div> <div> {{ form.message.label_tag }} {{ form.message }} {% if form.message.errors %} <div class="error">{{ form.message.errors }}</div> {% endif %} </div> <button type="submit">Send Message</button> </form>
این تضمین میکند که کاربران پیامهای خطای مربوطه را مستقیماً در کنار فیلدهایی که باید تصحیح کنند ببینند و قابلیت استفاده و دسترسی فرم را افزایش میدهد.
نمایش خطاهای فرم در قالب ها
هنگام کار با فرم ها در جنگو، ارائه بازخورد واضح به کاربران بسیار مهم است روی خطاهای اعتبارسنجی جنگو این کار را با پیوست کردن پیغامهای خطا برای تشکیل فیلدها، که میتوانند در قالبها نمایش داده شوند، ساده میکند.
استفاده از پیام های خطای پیش فرض
جنگو به طور خودکار پیام های خطای پیش فرض را برای ورودی نامعتبر ایجاد می کند روی نوع فیلد و قوانین اعتبارسنجی این پیام ها قابلیت استفاده اولیه را بدون نیاز به سفارشی سازی اضافی تضمین می کنند:
- این فیلد الزامی است. برای فیلدهای الزامی خالی بماند.
- یک آدرس ایمیل معتبر وارد کنید. برای ورودی نامعتبر در یک فیلد ایمیل.
- مطمئن شوید که این مقدار حداکثر دارای X کاراکتر است. برای فراتر رفتن از حداکثر_طول محدود در الف CharField.
در اینجا نمونه ای از نمایش پیام های خطای پیش فرض آورده شده است:
<form method="post"> {% csrf_token %} <div> {{ form.name.label_tag }} {{ form.name }} {{ form.name.errors }} </div> <div> {{ form.email.label_tag }} {{ form.email }} {{ form.email.errors }} </div> <div> {{ form.message.label_tag }} {{ form.message }} {{ form.message.errors }} </div> <button type="submit">Send Message</button> </form>
سفارشی کردن پیام های خطا
در حالی که پیامهای پیشفرض جنگو مفید هستند، ممکن است بخواهید آنها را خاصتر یا متناسب با مخاطبان خود کنید. می توانید این کار را با تنظیم کردن انجام دهید error_messages پارامتر هنگام تعریف فیلدها در کلاس فرم شما.
به عنوان مثال، برای تنظیم پیام های خطای سفارشی در سطح زمینه فرم هاpy:
from django import forms class ContactForm(forms.Form): name = forms.CharField( max_length=100, error_messages={ 'required': 'Please enter your name.', 'max_length': 'Name must not exceed 100 characters.' } ) email = forms.EmailField( error_messages={ 'required': 'We need your email address to contact you.', 'invalid': 'Please enter a valid email address.' } ) message = forms.CharField( widget=forms.Textarea, error_messages={'required': 'Don’t forget to include a message!'} )
استفاده از فرمست های جنگو
مجموعه فرم لایهای از انتزاع بر روی چندین فرم است که ایجاد، اعتبارسنجی و آسانتر شدن آن را آسانتر میکند process چندین فرم به طور همزمان با فرمستها، میتوانید چندین نمونه از یک فرم را به طور مؤثر مدیریت کنید روی یک مجرد page.
فرمستها بهویژه برای مدیریت دادههای مرتبط یا فرمهای پویا، مانند افزودن چندین ورودی به یک پایگاه داده به طور همزمان مفید هستند. جنگو این را ساده می کند process با formset_factory تابع ابزار، که یک کلاس فرمت را از یک کلاس فرم تولید می کند.
ایجاد یک مجموعه فرم
برای ایجاد یک مجموعه فرم، یک فرم پایه در آن تعریف کنید فرم هاpy فایل:
# forms.py from django import forms class ItemForm(forms.Form): name = forms.CharField(max_length=100) quantity = forms.IntegerField(min_value=1)
سپس با استفاده از یک فرم مجموعه ایجاد کنید formset_factory در دیدگاه هاpy:
# views.py from django.shortcuts import render from django.forms import formset_factory from .forms import ItemForm def manage_items(request): ItemFormSet = formset_factory(ItemForm, extra=3) # Create 3 empty forms by default if request.method == "POST": formset = ItemFormSet(request.POST) if formset.is_valid(): for form in formset: # Process each form's cleaned data print(form.cleaned_data) return redirect('success') # Redirect after processing else: formset = ItemFormSet() return render(request, 'manage_items.html', {'formset': formset})
استفاده از فرم مجموعه های مدل
اگر فرم ست به یک مدل گره خورده است، می توانید از جنگو استفاده کنید modelformset_factory برای ایجاد یک مجموعه فرم به طور مستقیم از یک کلاس مدل، به عنوان مثال:
from django.forms import modelformset_factory from .models import Item def manage_items(request): ItemFormSet = modelformset_factory(Item, fields=('name', 'quantity'), extra=3) if request.method == "POST": formset = ItemFormSet(request.POST) if formset.is_valid(): formset.save() # Save all forms at once return redirect('success') else: formset = ItemFormSet() return render(request, 'manage_items.html', {'formset': formset})
نتیجه گیری
فرم های جنگو مدیریت ورودی کاربر را با اعتبار سنجی داخلی، پیام های خطای قابل تنظیم و انعطاف پذیری رندر ساده می کند. در این راهنما، روش ایجاد فرمها به صورت دستی، تولید آنها از مدلها و مدیریت فرمهای متعدد با مجموعههای فرم را نشان دادهایم.
شما همچنین می توانید از ویژگی های پیشرفته مانند formset_factory، روش های اعتبار سنجی سفارشی و مجموعه فرم ها برای ایجاد فرم های کاربرپسند و قوی برای سناریوهای پیچیده مدیریت داده ها. اگر هنوز در مورد رسیدگی به فرمهای جنگو سؤالی دارید، از کادر نظر زیر استفاده کنید!
جنگو سوالات متداول را تشکیل می دهد
فرم های جنگو چیست؟
فرمهای جنگو کلاسهایی هستند که مدیریت ورودی کاربر را با تولید عناصر فرم HTML، اعتبارسنجی دادهها و پردازش ارسالها ساده میکنند. آنها از فیلدهای سفارشی، اعتبار سنجی داخلی و مدیریت خطا پشتیبانی می کنند. فرم های جنگو جمع آوری داده ها را ساده می کند و ورودی را مستقیماً با مدل ها برای مدیریت کارآمد داده ها یکپارچه می کند.
چگونه یک فرم در جنگو ایجاد کنم؟
برای ایجاد فرم در جنگو، کلاسی را تعریف کنید که از آن ارث می برد فرم ها.فرم یا forms.ModelForm در شما فرم هاpy فایل فیلدها را به عنوان ویژگی های کلاس اضافه کنید، مانند CharField یا فیلد ایمیل. برای فرم های مبتنی بر مدل، ModelForm به طور خودکار فیلدها را به مدل مشخص شده نگاشت می کند و مدیریت داده ها را ساده می کند.
چگونه می توانم داده های فرم را در جنگو تأیید کنم؟
جنگو بهطور خودکار دادههای فرم را با استفاده از اعتبارسنجیهای داخلی اعتبارسنجی میکند is_valid() نامیده می شود روی یک نمونه فرم افزودن اعتبار سنجی سفارشی با تمیز_ روش هایی برای زمینه های خاص یا تمیز () برای کل فرم این تضمین می کند که داده ها قبل از ذخیره یا پردازش بیشتر، الزامات را برآورده می کنند.
لطفا در صورت وجود مشکل در متن یا مفهوم نبودن توضیحات، از طریق دکمه گزارش نوشتار یا درج نظر روی این مطلب ما را از جزییات مشکل مشاهده شده مطلع کنید تا به آن رسیدگی کنیم
زمان انتشار: 1403-12-26 04:08:07