مقدمه
به فصل نوزدهم خوش آمدید! در این فصل، اپلیکیشن وبلاگ خود را با افزودن حسابهای کاربری و قابلیت
ورود داده توسط کاربران، به یک سطح جدید خواهیم برد. اولین قدم برای تعاملی کردن وبسایت، ایجاد
فرمهایی است که به کاربران اجازه میدهند تا دادههای خود را وارد کنند. ما یک فرم برای افزودن
موضوعات جدید و یک فرم دیگر برای افزودن یادداشتهای جدید خواهیم ساخت.
ایجاد فرم با ModelForm
Django کار با فرمها را بسیار ساده میکند. ما میتوانیم با ایجاد یک کلاس که از
forms.ModelForm ارثبری میکند، به صورت خودکار یک فرم بر اساس یکی از مدلهای خود بسازیم.
یک فایل جدید به نام forms.py در پوشه اپلیکیشن learning_logs ایجاد کنید.
learning_logs/forms.py
from django import forms
from .models import Topic
class TopicForm(forms.ModelForm):
class Meta:
model = Topic
fields = ['text']
labels = {'text': ''}
این کد یک فرم به نام TopicForm میسازد که بر اساس مدل Topic است. فیلد text
تنها فیلد موجود
در فرم خواهد بود و labels مشخص میکند که هیچ برچسبی برای این فیلد نمایش داده نشود.
پردازش درخواستهای GET و POST
حالا باید یک ویو و URL جدید برای صفحه "افزودن موضوع جدید" بسازیم. این ویو باید دو نوع درخواست را
مدیریت کند: درخواست GET (زمانی که کاربر برای اولین بار صفحه را باز میکند) و درخواست
POST
(زمانی که کاربر فرم را پر کرده و ارسال میکند).
learning_logs/views.py
from django.shortcuts import render, redirect
from .models import Topic
from .forms import TopicForm
def new_topic(request):
"""Add a new topic."""
if request.method != 'POST':
form = TopicForm()
else:
form = TopicForm(data=request.POST)
if form.is_valid():
form.save()
return redirect('learning_logs:topics')
context = {'form': form}
return render(request, 'learning_logs/new_topic.html', context)
در این ویو، ما ابتدا نوع درخواست را بررسی میکنیم. اگر GET باشد، یک فرم خالی میسازیم.
اگر
POST باشد، دادههای ارسال شده (request.POST) را به فرم پاس میدهیم.
سپس با form.is_valid() اعتبارسنجی دادهها را انجام میدهیم. اگر
دادهها معتبر باشند، با form.save() آنها را در پایگاهداده ذخیره
کرده و کاربر را به صفحه لیست موضوعات redirect میکنیم. در غیر این صورت، فرم (که اکنون
حاوی
پیامهای خطا است) دوباره به کاربر نمایش داده میشود.
تمپلیت فرم
در نهایت، تمپلیت new_topic.html را برای نمایش فرم میسازیم.
learning_logs/templates/learning_logs/new_topic.html
{% extends "learning_logs/base.html" %}
{% block content %}
<p>Add a new topic:</p>
<form action="{% url 'learning_logs:new_topic' %}" method='post'>
{% csrf_token %}
{{ form.as_p }}
<button name='submit'>Add topic</button>
</form>
{% endblock content %}
در این تمپلیت، ما یک تگ <form> با متد post ایجاد میکنیم. تگ {% csrf_token %} یک اقدام
امنیتی مهم در Django برای
جلوگیری از حملات Cross-Site Request Forgery است. {{ form.as_p
}} نیز به Django میگوید که
تمام فیلدهای فرم را به صورت پاراگرافهای مجزا رندر کند.
در این درس، ما با موفقیت به کاربران اجازه دادیم تا از طریق یک فرم وب، دادههای جدیدی را به
اپلیکیشن ما اضافه کنند. با استفاده از ModelForm و مدیریت درخواستهای GET و
POST، یک
گردش کار کامل برای ورود داده ایجاد کردیم. در درس بعدی، به سراغ «راهاندازی حسابهای کاربری»
خواهیم رفت تا به کاربران اجازه دهیم در سایت ثبتنام کرده و وارد شوند.