یاد بگیرید که چگونه یک برنامه مدیریت وظیفه با استفاده از اصول CRUD و نماهای کلاس محور در جنگو بسازید.
یکی از ویژگی های کلیدی جنگو پشتیبانی داخلی آن برای ایجاد پروژه ها در بالای عملیات CRUD (ایجاد، خواندن، به روز رسانی، حذف) است. در حالی که نماهای مبتنی بر کلاس جنگو راهی سریع، آسان و منعطف برای ساخت برنامه های کاربردی وب ارائه می دهند، بسیاری از توسعه دهندگان هنوز از نماهای مبتنی بر عملکرد استفاده می کنند.
نماهای مبتنی بر کلاس مزایای متعددی را نسبت به نماهای مبتنی بر عملکرد ارائه می دهند، از جمله وراثت، ساختار کد، قابلیت استفاده مجدد کد و موارد دیگر. در حالی که اجرای نماهای مبتنی بر کلاس ممکن است کمی پیچیده به نظر برسد، این راهنما با ساختن یک برنامه مدیریت وظیفه و ارائه دستورالعمل های گام به گام به شما در درک مفهوم کمک می کند.
نماهای کلاس محور در جنگو چیست؟
در جنگو، view ها توابع پایتون هستند که یک درخواست وب را می گیرند و یک پاسخ وب را برمی گردانند. نماهای مبتنی بر کلاس (CBVs) یک راه جایگزین برای تعریف نماها در جنگو با استفاده از کلاس های پایتون به جای توابع است.
CBV ها چندین مزیت دارند، مانند سازماندهی بهتر کد، استفاده مجدد آسان تر از کد، و توانایی استفاده از وراثت برای ایجاد تغییرات در نماهای موجود. CBV ها همچنین متدهای داخلی مانند متدهای get() و post() را ارائه می دهند که می توانید برای رفتارهای سفارشی بازنویسی کنید.
کد استفاده شده در این مقاله در این مخزن GitHub موجود است.
نماهای کلاس محور در جنگو موجود است
جنگو برخی از CBV های داخلی را برای موارد استفاده رایج، مانند نمایش لیستی از اشیاء یا ایجاد موارد جدید، ارائه می دهد. برخی از این CBV های داخلی عبارتند از:
- ListView: این نما فهرستی از اشیاء بازیابی شده از یک مدل را ارائه می دهد. به عنوان مثال، صفحه ای که تمام پست های موجود در وبلاگ را فهرست می کند، از ListView استفاده می کند.
- DetailView: این نمای یک نمای دقیق از یک شی منفرد بازیابی شده از یک مدل را ارائه می دهد. می توانید از DetailView برای نمایش جزئیات پست های خاص در یک برنامه وبلاگ استفاده کنید.
- CreateView: این نمای یک فرم را برای ایجاد یک شی جدید ارائه می دهد و ارسال فرم را مدیریت می کند. به عنوان مثال، در یک برنامه مدیریت وظیفه، از این نمای برای ایجاد وظایف جدید استفاده خواهید کرد.
- DeleteView: این نما یک صفحه تأیید را برای حذف یک شی ارائه می دهد و حذف صفحه را مدیریت می کند.
- UpdateView: این نمای یک فرم را برای به روز رسانی یک شی موجود ارائه می دهد و ارسال فرم را مدیریت می کند.
جنگو نماهای دیگری از جمله TemplateView، RedirectView و FormView را نیز ارائه می دهد. برای اطلاعات دقیق در مورد نماهای مبتنی بر کلاس می توانید به مستندات جنگو مراجعه کنید.
یک برنامه Task Manager با نماهای مبتنی بر کلاس جنگو بسازید
ساختن اپلیکیشنی مانند برنامه مدیریت وظیفه به شما امکان می دهد تا نحوه اجرای عملیات CRUD را با CBV ها درک کنید. یک Task Manager دارای ویژگی هایی است که به کاربران امکان می دهد وظایف را ایجاد، به روز رسانی، حذف و مطالعه کنند. این ویژگی ها در راستای عملیات CRUD هستند. مراحل زیر به شما کمک می کند تا با Django CBVs یک برنامه مدیریت وظیفه بسازید.
راه اندازی یک پروژه جنگو
برای ایجاد یک برنامه مدیریت وظیفه با جنگو، باید این مراحل را دنبال کنید:
- جنگو را با این دستور در محیط مجازی پایتون خود نصب کنید: pip install django
- یک پروژه جنگو ایجاد کنید. دستور زیر پروژه ای به نام project_core ایجاد می کند. django-admin startproject project_core .
- یک اپلیکیشن به نام task_manager ایجاد کنید. python manager.py startapp task_manager
- در settings.py نام برنامه خود را به لیست INSTALLED_APPS اضافه کنید. INSTALLED_APPS = [ ‘task_manager’،]
- فایل urls.py را در فهرست پروژه خود باز کنید و URL ها را برای برنامه task_manager خود پیکربندی کنید: از مسیر واردات django.urls، includeurlpatterns = [ path(”, include(‘task_manager.urls’))،]
pip install django
django-admin startproject project_core .
python manage.py startapp task_manager
INSTALLED_APPS = [
'task_manager',
]
from django.urls import path, include
urlpatterns = [
path('', include('task_manager.urls')),
]
یک مدل برای برنامه مدیریت وظیفه خود ایجاد کنید
در فهرست برنامه (یا پوشه task_manager)، فایل models.py خود را باز کنید و یک مدل برای برنامه مدیریت وظیفه خود ایجاد کنید. در اینجا یک مدل نمونه وجود دارد که می توانید استفاده کنید:
from django.db import models
class Task(models.Model):
title = models.CharField(max_length=200)
description = models.TextField()
completed = models.BooleanField(default=False)
created_at = models.DateTimeField(auto_now_add=True)
مدل خود را با این دستور مهاجرت کنید:
python manage.py makemigrations && python manage.py migrate
یک فرم جنگو برای برنامه خود ایجاد کنید
شما باید یک فرم برای مدیریت عملیات ایجاد و بهروزرسانی داشته باشید. در فهرست برنامه خود، یک فایل به نام forms.py ایجاد کنید. در اینجا یک مثال است:
from django import forms
from .models import Task
class TaskForm(forms.ModelForm):
class Meta:
model = Task
fields = ['title', 'description', 'completed']
widgets = {
'title': forms.TextInput(attrs={'class': 'form-control',}),
'description': forms.Textarea(attrs={'class': 'form-control',}),
'completed': forms.CheckboxInput(attrs={'class': 'form-check-input'}),
}
کد بالا دارای کلاسی به نام TaskForm است که فیلدها و ابزارک های فرم را تعریف می کند. همچنین مدل مورد استفاده را مشخص می کند.
برای هر عملیات CRUD نماهای جنگو ایجاد کنید
یک برنامه اولیه CRUD با CBV ها حداقل به چهار نمایش نیاز دارد تا همه عملیات را به طور موثر انجام دهد. چند مرحله بعدی نحوه ایجاد آنها را به شما نشان می دهد.
ماژول ها و بسته های لازم را وارد کنید
فایل views.py خود را باز کنید و موارد زیر را وارد کنید:
from django.views.generic import ListView, DetailView, CreateView, UpdateView, DeleteView
from django.urls import reverse_lazy
from .models import Task
from .forms import TaskForm
کد بالا پنج CBV را وارد می کند. همچنین reverse_lazy را وارد میکند تا کاربر را پس از ارسال فرم به یک URL مشخص هدایت کند. در نهایت، مدل Task و TaskForm که قبلا ایجاد شده بود را وارد می کند.
یک View to List اشیاء مدل ایجاد کنید
یک برنامه مدیریت وظیفه باید صفحه ای داشته باشد که تمام وظایف ایجاد شده توسط کاربر را فهرست کند. برای ایجاد نما برای این کار، باید از ListView استفاده کنید. در اینجا یک مثال است:
class TaskListView(ListView):
model = Task
template_name = 'task_manager/task_list.html'
context_object_name = 'tasks'
نمای بالا سه ویژگی را تعریف می کند که عبارتند از:
- model: این ویژگی مشخص می کند که از کدام مدل برای آن نمای خاص استفاده شود.
- template_name: این ویژگی به جنگو می گوید که کدام الگو را به مرورگر ارائه دهد.
- context_object_name: این ویژگی نامی را تعریف می کند که به الگو اجازه می دهد به لیست اشیاء در مدل دسترسی داشته باشد.
اکثر CBV ها حاوی این سه ویژگی هستند.
یک نمای برای رسیدگی به جزئیات کار ایجاد کنید
هر وظیفه ای که کاربر ایجاد می کند باید صفحه ای داشته باشد که جزئیات آن را نشان دهد. CBV ایده آل برای رسیدگی به این DetailVew است. در اینجا یک مثال ساده است:
class TaskDetailView(DetailView):
model = Task
template_name = 'task_manager/task_detail.html'
یک نمای برای ایجاد کار ایجاد کنید
یک نمای برای مدیریت ایجاد یا اضافه کردن وظایف جدید ایجاد کنید. این قسمت Create از عملیات CRUD است و نمای مناسب برای آن CreateView است. در اینجا نحوه استفاده از آن آمده است:
class TaskCreateView(CreateView):
model = Task
form_class = TaskForm
template_name = 'task_manager/task_form.html'
success_url = reverse_lazy('task_list')
کد بالا دو ویژگی جدید را معرفی می کند: form_class و success_url.
ویژگی form_class به view می گوید که کدام کلاس فرم را رندر کند و برای عملیات خود استفاده کند.
success_url نحوه تغییر مسیر کاربر پس از ارسال فرم را مشخص می کند. از تابع reverse_lazy استفاده می کند که نام یک مسیر URL را می گیرد.
یک نمای برای ویرایش وظایف ایجاد کنید
برای اینکه به کاربران خود اجازه دهید وظایف خود را ویرایش یا به روز کنند، باید نمایی به شکل زیر ایجاد کنید:
class TaskUpdateView(UpdateView):
model = Task
form_class = TaskForm
template_name = 'task_manager/task_form.html'
success_url = reverse_lazy('task_list')
نمای بالا شبیه به TaskCreateView است که قبلا ایجاد شده بود. تنها تفاوت در استفاده از UpdateView است.
یک نمای برای مدیریت عملیات حذف ایجاد کنید
برای اینکه به کاربران خود اجازه دهید هر زمان که می خواهند وظایف را حذف کنند، باید از DeleteView CBV استفاده کنید. در اینجا یک مثال است:
class TaskDeleteView(DeleteView):
model = Task
template_name = 'task_manager/task_confirm_delete.html'
success_url = reverse_lazy('task_list')
URL های برنامه خود را پیکربندی کنید
در فهرست برنامه خود، یک فایل urls.py ایجاد کنید و الگوهای URL خود را مانند این پیکربندی کنید:
from django.urls import path
from .views import TaskListView, TaskDetailView, TaskCreateView, TaskUpdateView, TaskDeleteView
urlpatterns =
path('', TaskListView.as_view(), name='task_list'),
path('create/', TaskCreateView.as_view(), name='task_create'),
path('tasks/<int:pk>/', TaskDetailView.as_view(), name='task_detail'),
path('tasks/<int:pk>/update/', TaskUpdateView.as_view(), name='task_update'),
path('tasks/<int:pk>/delete/', TaskDeleteView.as_view(), name='task_delete'),
]
الگوهای URL در بالا مشابه URL های ایجاد شده با نماهای مبتنی بر عملکرد هستند. تفاوت در تابع as_view () است که به انتهای نام هر view اضافه شده است.
می توانید به جای کلید اصلی استفاده شده در بالا از Slugs جنگو برای ایجاد URL استفاده کنید.
الگوهایی برای نماهای خود ایجاد کنید
اجازه دادن به کاربران خود برای انجام اقدامات تعریف شده در نماهای بالا نشان می دهد که یک رابط برای تعامل با آن ها فراهم کنید. از نماهایی که قبلا ایجاد شده است، برنامه مدیریت وظیفه باید دارای چهار رابط کاربری باشد.
در فهرست برنامه خود، چهار قالب HTML ایجاد کنید. همچنین باید فایل base.html ایجاد کنید. برای صرفه جویی در زمان می توانید قالب های جنگو خود را با بوت استرپ استایل دهید.
الگوی لیست وظایف
این الگو باید شامل کدی باشد که تمام وظایف مدل را فهرست کند. یک مثال اسکلتی از کد این است:
{% extends 'base.html' %}
{% block content %}
<center>
<h1>Your Tasks</h1>
<a href="{% url 'task_create' %}">Add Task</a>
{% for task in tasks %}
<div>
<div>
<h5>{{ task.title }}</h5>
<p>{{ task.description|truncatechars:50 }}</p>
<p>
<strong>Completed:</strong>
{% if task.completed %}Yes{% else %}No{% endif %}
</p>
<a href="{% url 'task_detail' task.pk %}">
Read more
</a>
<a href="{% url 'task_delete' task.pk %}">
Delete task
</a>
</div>
</div>
{% empty %}
<h3>No tasks yet.</h3>
<a href="{% url 'task_create' %}">Add Task</a>
{% endfor %}
</center>
{% endblock %}
با برخی از کلاس های بوت استرپ، می توانید صفحه خود را به شکل زیر در آورید:
الگوی جزئیات کار
این صفحه باید جزئیات کامل هر کار ایجاد شده را نشان دهد. در اینجا یک نمونه الگو وجود دارد که می توانید از آن استفاده کنید:
{% extends 'base.html' %}
{% block content %}
<h1>{{ task.title }}</h1>
<p>{{ task.description }}</p>
<p>Completed: {% if task.completed %}Yes{% else %}No{% endif %}</p>
<a href="{% url 'task_update' task.pk %}">Edit task</a>
<a href="{% url 'task_delete' task.pk %}">Delete task</a>
{% endblock %}
بسته به روش استایل شما، صفحه شما باید به شکل زیر باشد:
قالب فرم وظیفه
این الگو باید حاوی فرمی باشد که به کاربر اجازه میدهد یک کار را ایجاد یا بهروزرسانی کند.
{% extends 'base.html' %}
{% block content %}
<h1>Create Task</h1>
<form method="post">
{% csrf_token %}
{{ form.as_p }}
<button type="submit">Save</button>
</form>
{% endblock %}
قالب به شکل زیر خواهد بود:
حذف Task Template
این الگو باید یک صفحه تایید برای جلوگیری از حذف تصادفی کارها باشد.
{% extends 'base.html' %}
{% block content %}
<h1>Confirm Delete</h1>
<p>Are you sure you want to delete "{{ object.title }}"?</p>
<form method="post">
{% csrf_token %}
<button type="submit">Delete</button>
<a href="{% url 'task_list' %}">Cancel</a>
</form>
{% endblock %}
با استفاده از بوت استرپ، صفحه شما باید به شکل زیر باشد:
از نماهای مبتنی بر کلاس برای افزایش بهره وری خود استفاده کنید
نماهای مبتنی بر کلاس روشی عالی برای نوشتن کدهای تمیز و سازماندهی شده در مدت زمان کوتاه است و در نتیجه بهره وری شما را افزایش می دهد. شما باید تا حد امکان از آنها در پروژه های خود استفاده کنید. همچنین، میتوانید ویژگیهایی مانند قابلیت جستجو، اعلانها، و غیره را بیشتر ادغام کنید تا برنامه مدیریت وظیفه خود را به یک برنامه کاربردی کاملاً کاربردی تبدیل کنید.