
روز ۳۳: آشنایی کامل با Class Based View (CBV) در جنگو
وقتی پروژههای جنگو از حالت ساده و آموزشی خارج میشوند و به سمت پروژههای واقعی و بزرگ حرکت میکنند، مدیریت Viewها با روش Function Based View بهمرور سخت و تکراری میشود. Class Based View یا همان CBV دقیقاً برای حل همین مشکل طراحی شده است. در CBV منطق برنامه به صورت شیگرا پیادهسازی میشود و همین موضوع باعث میشود کدها ساختارمندتر، قابل توسعهتر و خواناتر باشند. استفاده از CBV به شما کمک میکند تا منطق مشترک بین Viewها را به راحتی بازنویسی نکنید و از قابلیت ارثبری در پایتون نهایت استفاده را ببرید.
تفاوت Function Based View و Class Based View
در Function Based View معمولاً تمام منطق پردازش درخواست GET و POST در یک تابع نوشته میشود و با بزرگتر شدن پروژه، این توابع به سرعت شلوغ و پیچیده میشوند. اما در Class Based View هر نوع درخواست در متد مخصوص به خودش مدیریت میشود. این موضوع باعث میشود کدها نظم بیشتری داشته باشند و درک آنها برای توسعهدهندگان دیگر سادهتر باشد. در واقع CBV یک دید حرفهایتر نسبت به ساخت Viewها در جنگو ارائه میدهد و در پروژههای تیمی یک انتخاب بسیار هوشمندانه محسوب میشود.
ساخت اولین Class Based View ساده
برای شروع کار با CBV بهتر است یک مثال ساده بزنیم. فرض کنید میخواهیم یک صفحه ساده ایجاد کنیم که فقط یک متن را نمایش دهد. در CBV این کار با ارثبری از کلاس View انجام میشود. در این حالت متد get مسئول پاسخدهی به درخواستهای GET خواهد بود و ساختار کلی کد بسیار تمیزتر از حالت تابعی به نظر میرسد.
from django.views import View
from django.http import HttpResponse
class HomeView(View):
def get(self, request):
return HttpResponse("Welcome to Django Class Based Views")این View دقیقاً همان کاری را انجام میدهد که یک Function Based View ساده انجام میدهد، اما با ساختاری شیگرا و قابل توسعه.
اتصال Class Based View به URL
یکی از تفاوتهای مهم CBV با FBV نحوه اتصال آن به فایل urls.py است. برای استفاده از CBV باید از متد as_view استفاده کنیم. این متد در واقع کلاس را به یک View قابل استفاده در سیستم URL جنگو تبدیل میکند. اگر این بخش به درستی انجام نشود، جنگو قادر به شناسایی View نخواهد بود.
from django.urls import path
from .views import HomeView
urlpatterns = [
path('', HomeView.as_view(), name='home'),
]این ساختار کاملاً استاندارد است و در تمام پروژههای حرفهای جنگو استفاده میشود.
Generic Class Based View چیست
جنگو برای جلوگیری از نوشتن کدهای تکراری، مجموعهای از Viewهای آماده به نام Generic Class Based View ارائه میدهد. این Viewها برای عملیاتهای رایجی مانند نمایش لیست دادهها، نمایش جزئیات یک آیتم، ایجاد، ویرایش و حذف دادهها طراحی شدهاند. استفاده از Generic Viewها باعث میشود حجم کد به شکل قابل توجهی کاهش پیدا کند و تمرکز شما روی منطق اصلی پروژه باقی بماند.
ListView برای نمایش لیست دادهها
یکی از پرکاربردترین Generic Viewها، کلاس ListView است. این View برای نمایش لیستی از دادههای یک Model استفاده میشود و در پروژههای بلاگ، فروشگاهی و خبری بسیار رایج است. با چند خط کد میتوان یک لیست کامل از مقالات یا محصولات را به Template ارسال کرد.
from django.views.generic import ListView
from .models import Article
class ArticleListView(ListView):
model = Article
template_name = 'articles/list.html'
context_object_name = 'articles'در این مثال، تمام مقالات از دیتابیس دریافت شده و در قالب متغیر articles به Template ارسال میشوند.
DetailView برای نمایش جزئیات یک آیتم
DetailView یکی دیگر از Generic Viewهای بسیار مهم است که برای نمایش جزئیات یک رکورد خاص استفاده میشود. در سیستمهای بلاگ، این View برای نمایش صفحه تکی مقاله کاربرد دارد. جنگو به صورت خودکار آیتم مورد نظر را بر اساس id یا slug پیدا میکند و به Template ارسال میکند.
from django.views.generic import DetailView
from .models import Article
class ArticleDetailView(DetailView):
model = Article
template_name = 'articles/detail.html'این View بدون نیاز به نوشتن Query دستی، مقاله مورد نظر را در اختیار شما قرار میدهد.
CreateView و ساخت فرم با CBV
یکی از جذابترین بخشهای CBV، استفاده از CreateView برای ساخت فرم ثبت اطلاعات است. این View به صورت پیشفرض فرم را مدیریت میکند، دادهها را اعتبارسنجی میکند و در دیتابیس ذخیره میکند. ترکیب CreateView با ModelForm باعث میشود فرمهای حرفهای با حداقل کد ساخته شوند.
from django.views.generic import CreateView
from .models import Article
class ArticleCreateView(CreateView):
model = Article
fields = ['title', 'content', 'image']
template_name = 'articles/create.html'
success_url = '/articles/'
این ساختار یکی از بهترین مثالها برای قدرت واقعی Class Based View در Django است.
استفاده از LoginRequiredMixin در CBV
برای محدود کردن دسترسی کاربران در CBV، به جای decorator از Mixinها استفاده میشود. LoginRequiredMixin یکی از پرکاربردترین Mixinهاست که اجازه دسترسی به View را فقط به کاربران لاگینشده میدهد. این روش بسیار تمیزتر و حرفهایتر از استفاده از decorator در Function Based View است.
from django.contrib.auth.mixins import LoginRequiredMixin
class ArticleCreateView(LoginRequiredMixin, CreateView):
model = Article
fields = ['title', 'content', 'image']
استفاده از Mixinها یکی از مهمترین مزایای CBV محسوب میشود.
چه زمانی از CBV استفاده کنیم
Class Based View زمانی بیشترین کاربرد را دارد که پروژه شما در حال رشد است و نیاز به توسعهپذیری بالا دارد. اگر Viewهای شما منطق پیچیدهای دارند یا عملیات CRUD زیادی در پروژه وجود دارد، CBV انتخاب بسیار مناسبی است. البته برای Viewهای بسیار ساده، Function Based View همچنان میتواند گزینه خوبی باشد و انتخاب بین این دو کاملاً به نیاز پروژه بستگی دارد.
جمعبندی روز سیوسوم
در روز سیوسوم با Class Based View در جنگو آشنا شدیم و دیدیم که چگونه میتوان Viewها را به شکل شیگرا، تمیز و حرفهای پیادهسازی کرد. همچنین با Generic Viewها، ListView، DetailView، CreateView و استفاده از Mixinها آشنا شدیم. تسلط بر CBV یکی از نشانههای ورود به سطح حرفهای جنگو است و نقش مهمی در ساخت پروژههای واقعی و رزومهای ایفا میکند.