مقدمه

به فصل نوزدهم خوش آمدید! در این فصل، اپلیکیشن وبلاگ خود را با افزودن حساب‌های کاربری و قابلیت ورود داده توسط کاربران، به یک سطح جدید خواهیم برد. اولین قدم برای تعاملی کردن وب‌سایت، ایجاد فرم‌هایی است که به کاربران اجازه می‌دهند تا داده‌های خود را وارد کنند. ما یک فرم برای افزودن موضوعات جدید و یک فرم دیگر برای افزودن یادداشت‌های جدید خواهیم ساخت.

ایجاد فرم با ModelForm

Django کار با فرم‌ها را بسیار ساده می‌کند. ما می‌توانیم با ایجاد یک کلاس که از forms.ModelForm ارث‌بری می‌کند، به صورت خودکار یک فرم بر اساس یکی از مدل‌های خود بسازیم.

یک فایل جدید به نام forms.py در پوشه اپلیکیشن learning_logs ایجاد کنید.

Copy Icon 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 (زمانی که کاربر فرم را پر کرده و ارسال می‌کند).

Copy Icon 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':
        # No data submitted; create a blank form.
        form = TopicForm()
    else:
        # POST data submitted; process data.
        form = TopicForm(data=request.POST)
        if form.is_valid():
            form.save()
            return redirect('learning_logs:topics')

    # Display a blank or invalid form.
    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 را برای نمایش فرم می‌سازیم.

Copy Icon 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، یک گردش کار کامل برای ورود داده ایجاد کردیم. در درس بعدی، به سراغ «راه‌اندازی حساب‌های کاربری» خواهیم رفت تا به کاربران اجازه دهیم در سایت ثبت‌نام کرده و وارد شوند.