نمایش‌های مبتنی بر کلاس در جنگو: ساختار، کاربرد و ویژگی‌های پیشرفته

این مقاله به معرفی نمایش‌های مبتنی بر کلاس (Class-Based Views) در جنگو، نحوه استفاده از آن‌ها در URLconf، روش‌های زیرکلاس‌سازی، پشتیبانی از متدهای HTTP مختلف، و ساخت نمایش‌های ناهمگام (Async Views) می‌پردازد. همچنین مثال‌های عملی برای درک بهتر ساختار CBVها ارائه شده است.

نمایش مبتنی بر کلاسCBV، TemplateViewListView، async view

~3 دقیقه مطالعه · آخرین به‌روزرسانی ۲۳ اسفند ۱۴۰۴

مقدمه

در جنگو، یک view هر تابع یا callableای است که یک درخواست HTTP را دریافت کرده و یک پاسخ برمی‌گرداند. اما جنگو علاوه بر نمایش‌های تابعی، یک سیستم قدرتمند از نمایش‌های مبتنی بر کلاس (Class-Based Views) ارائه می‌دهد که امکان استفاده از اصول شیءگرایی مانند ارث‌بری و mixinها را فراهم می‌کند. این ساختار باعث افزایش قابلیت استفاده مجدد و سازمان‌دهی بهتر کد می‌شود.


نمایش‌های مبتنی بر کلاس چیست؟

تمام CBVها از کلاس پایه View ارث می‌برند. این کلاس مسئول مدیریت dispatch متدهای HTTP، اتصال view به URLها و ارائه امکانات مشترک است. جنگو همچنین مجموعه‌ای از نمایش‌های عمومی (Generic Views) را برای کارهای رایج مانند نمایش قالب یا لیست اشیا فراهم کرده است.


نمونه‌های پایه از CBVهای داخلی

  • View: کلاس پایه تمام CBVها.
  • RedirectView: ایجاد پاسخ HTTP Redirect.
  • TemplateView: رندر یک قالب HTML.

استفاده از CBV در URLconf

ساده‌ترین روش استفاده از CBVها، فراخوانی as_view() در فایل URLconf است:


from django.urls import path
from django.views.generic import TemplateView

urlpatterns = [
    path("about/", TemplateView.as_view(template_name="about.html")),
]

پارامترهای ارسال‌شده به as_view() ویژگی‌های کلاس را override می‌کنند.


زیرکلاس‌سازی نمایش‌های عمومی

روش قدرتمندتر، ایجاد یک زیرکلاس از یک CBV موجود و override کردن ویژگی‌ها یا متدهاست. مثال:


# some_app/views.py
from django.views.generic import TemplateView

class AboutView(TemplateView):
    template_name = "about.html"

و سپس در URLconf:


from django.urls import path
from some_app.views import AboutView

urlpatterns = [
    path("about/", AboutView.as_view()),
]

پشتیبانی از متدهای HTTP دیگر

CBVها امکان تعریف متدهای مختلف HTTP مانند get()، post()، put() و head() را فراهم می‌کنند. مثال زیر نحوه استفاده از HEAD برای بهینه‌سازی API را نشان می‌دهد:


from django.http import HttpResponse
from django.views.generic import ListView
from books.models import Book

class BookListView(ListView):
    model = Book

    def head(self, *args, **kwargs):
        last_book = self.get_queryset().latest("publication_date")
        response = HttpResponse(
            headers={
                "Last-Modified": last_book.publication_date.strftime(
                    "%a, %d %b %Y %H:%M:%S GMT"
                )
            }
        )
        return response

درخواست GET لیست کامل کتاب‌ها را برمی‌گرداند، اما درخواست HEAD تنها هدر Last-Modified را ارسال می‌کند.


نمایش‌های ناهمگام (Asynchronous Views)

جنگو از نمایش‌های ناهمگام با استفاده از async def پشتیبانی می‌کند. این قابلیت برای عملیات I/O مانند درخواست‌های API بسیار مفید است:


import asyncio
from django.http import HttpResponse
from django.views import View

class AsyncView(View):
    async def get(self, request, *args, **kwargs):
        await asyncio.sleep(1)
        return HttpResponse("Hello async world!")

نکته مهم: تمام متدهای یک CBV باید یا همگی synchronous باشند یا همگی asynchronous. ترکیب این دو باعث بروز خطای ImproperlyConfigured می‌شود.


جمع‌بندی

نمایش‌های مبتنی بر کلاس در جنگو یک ابزار قدرتمند برای ساختاردهی بهتر کد، استفاده مجدد از منطق، و مدیریت آسان‌تر درخواست‌های HTTP هستند. با استفاده از ارث‌بری، override کردن متدها، پشتیبانی از متدهای مختلف HTTP و قابلیت async، می‌توان نمایش‌هایی حرفه‌ای، مقیاس‌پذیر و قابل نگهداری ایجاد کرد.

نوشته و پژوهش‌شده توسط دکتر شاهین صیامی

مقالات مرتبط

فریم‌ورک Tasks در Django: راهنمای کامل اجرای کارهای پس‌زمینه در Django 6.0

Django 6.0 فریم‌ورک Tasks را معرفی کرده است؛ سیستمی داخلی برای تعریف و صف‌بندی کارهای پس‌زمینه خارج از چرخهٔ request–response. این مقاله نحوهٔ کار Tasks، پیکربندی backendها، تعریف و enqueue کردن Taskها، استفاده از context، و ادغام با سیستم‌های Worker خارجی را توضیح می‌دهد.

ادامه

پشتیبانی Asynchronous در Django: راهنمای کامل Async Views، ORM، Middleware، عملکرد و ایمنی

این مقاله پشتیبانی Django از برنامه‌نویسی غیرهم‌زمان (async) را توضیح می‌دهد. موضوعاتی مانند async views، اجرای Django تحت ASGI، رفتار middleware، قابلیت‌های ORM غیرهم‌زمان، sync_to_async، مدیریت قطع اتصال، نکات عملکردی، و مکانیزم‌های ایمنی Django برای جلوگیری از استفادهٔ ناامن async بررسی می‌شوند.

ادامه

System Check Framework در Django: راهنمای کامل نوشتن، ثبت، اجرا و تست چک‌های سیستمی

System Check Framework در Django مجموعه‌ای از بررسی‌های استاتیک برای تشخیص مشکلات رایج در پروژه است. این مقاله نحوهٔ اجرای چک‌ها، نوشتن چک‌های سفارشی، مدیریت پیام‌ها، برچسب‌گذاری چک‌ها، افزودن چک به مدل‌ها و فیلدها، و نوشتن تست‌های واحد و یکپارچه برای چک‌ها را توضیح می‌دهد.

ادامه

سیگنال‌ها در Django: راهنمای کامل استفاده، اتصال، ارسال و مدیریت Signalها

این مقاله سیستم سیگنال‌های Django را توضیح می‌دهد؛ مکانیزمی برای اطلاع‌رسانی رویدادها بین بخش‌های مختلف برنامه بدون ایجاد وابستگی مستقیم. موضوعاتی مانند نحوهٔ اتصال receiverها، استفاده از decorator، مدیریت senderهای خاص، محل مناسب قرارگیری کد سیگنال‌ها، هشدارهای مهم، و بهترین شیوه‌ها بررسی می‌شوند.

ادامه

آشنایی کامل با Django Settings: پیکربندی، مدیریت محیط، و بهترین شیوه‌ها

این مقاله یک راهنمای جامع دربارهٔ سیستم تنظیمات در Django ارائه می‌دهد. موضوعاتی مانند ساختار فایل تنظیمات، نحوهٔ تعیین DJANGO_SETTINGS_MODULE، استفاده از settings در کد، امنیت، پیکربندی دستی با configure()، استفادهٔ مستقل از Django با django.setup() و ایجاد تنظیمات سفارشی بررسی می‌شوند.

ادامه

سریال‌سازی و دسریال‌سازی در Django: راهنمای کامل کار با Serialization Framework

این مقاله سیستم سریال‌سازی Django را توضیح می‌دهد؛ از نحوهٔ تبدیل مدل‌ها به JSON، XML، YAML و JSONL گرفته تا دسریال‌سازی داده‌ها، سریال‌سازی فیلدهای انتخابی، کار با مدل‌های ارث‌بری، مدیریت روابط، و نکات مهم هنگام ذخیرهٔ داده‌های دسریال‌شده.

ادامه