نحوه استفاده از نماهای جنگو

نماهای جنگو یکی از اجزای کلیدی هر برنامه وب هستند که داده ها و رابط کاربری برنامه شما را پل می کنند.

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

نما در جنگو چیست؟

نماهای جنگو یک جزء ضروری است که منطق روش پاسخگویی برنامه شما به درخواست های کاربر را کنترل می کند.

به بیان ساده، یک view یک درخواست وب را می گیرد، آن را پردازش می کند و یک پاسخ را برمی گرداند – اغلب به شکل یک HTML رندر شده page. نماها به عنوان پلی بین داده های برنامه که توسط مدل ها مدیریت می شود و ارائه آن که توسط الگوهای جنگو مدیریت می شود عمل می کنند.

انواع نماها در جنگو

جنگو دو نوع نمای اصلی دارد: نماهای مبتنی بر عملکرد (FBV) و نماهای کلاس محور (CBV). هر دو هدف یکسانی را دنبال می‌کنند، اما راه‌های متفاوتی برای سازمان‌دهی کد ارائه می‌دهند.

نماهای مبتنی بر عملکرد (FBV)

نماهای مبتنی بر تابع، توابع ساده پایتون برای رسیدگی به درخواست‌های HTTP و برگرداندن پاسخ‌ها هستند. آنها بصری و ایده آل هستند که در آن شما به کنترل بیشتری بر هر جنبه از چرخه عمر درخواست و پاسخ نیاز دارید.

در اینجا نمونه ای از یک FBV ساده است که یک قالب HTML را ارائه می دهد:

from django.shortcuts import render

# Function-based view
def homepage(request):
    return render(request, 'homepage.html')

در این مثال:

  • درخواست کنید – شی درخواست HTTP حاوی ابرداده در مورد درخواست کاربر را نشان می دهد.
  • ارائه دهد – ترکیب می کند homepage.html الگو با داده های زمینه در صورت ارائه و برمی گرداند HttpResponse شی

FBV ها به راحتی قابل درک و پیاده سازی هستند، اما اگر به دقت مدیریت نشوند، می توانند منجر به توابع متورم با منطق پیچیده شوند، به خصوص در هنگام رسیدگی به وظایفی مانند فرم ها، احراز هویت، یا الگوهای قابل استفاده مجدد.

نماهای کلاس محور (CBV)

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

نماهای عمومی داخلی مانند ListView و DetailView با ارائه منطق آماده برای کارهایی مانند رندر کردن لیست اشیاء، جزئیات، فرم‌ها و موارد دیگر، کد boilerplate را کاهش دهید.

در اینجا نمونه ای از یک CBV است که عملکرد مشابه FBV قبلی را انجام می دهد:

from django.views.generic import TemplateView

# Class-based view
class HomePageView(TemplateView):
    template_name="homepage.html"

در این مثال:

  • TemplateView – یک نمای عمومی داخلی که یک الگو را ارائه می دهد.
  • نام_قالب – فایل الگو را برای رندر مشخص می کند، درست مانند مثال FBV.

برای استفاده از این CBV در پیکربندی URL، باید آن را وارد کنید .as_view() روش هنگام اضافه کردن آن به آدرس های اینترنتیpy:

from django.urls import path
from .views import HomePageView

urlpatterns = [
    path('', HomePageView.as_view(), name="home"),
]

زمان استفاده از FBV در مقابل CBVs

  • از FBV ها استفاده کنید زمانی که به سادگی و کنترل کامل بر منطق دید خود نیاز دارید. آنها اغلب برای نماهای کوچک یا منطق سفارشی که در الگوهای نمای از پیش تعریف شده جنگو قرار نمی گیرند، بصری تر هستند.
  • از CBV ها استفاده کنید وقتی می خواهید دنبال کنید خودت را تکرار نکن (خشک) اصول و استفاده مجدد از منطق موجود CBV ها زمانی ایده آل هستند که نماهای شما از نظر پیچیدگی افزایش می یابد، مانند هنگام مدیریت فرم ها، داده های صفحه بندی شده یا عملیات استاندارد CRUD.

هر دو FBV و CBV جزء جنگو هستند و انتخاب بین آنها بستگی دارد روی الزامات پروژه شما و ترجیح شخصی شما.

برای الهام گرفتن، برخی از توسعه دهندگان ترجیح می دهند برای نمونه سازی یا پروژه های کوچک با FBV ها شروع کنند و در مقیاس پروژه یا زمانی که به ساختار و قابلیت استفاده مجدد بیشتری نیاز دارند به CBV ها روی بیاورند.

پیشنهاد می‌کنیم بخوانید:  روش راه اندازی سرور FTP روی اوبونتو وی پی اس

نماهای عمومی داخلی در جنگو

نماهای عمومی داخلی جنگو راهی برای مدیریت الگوهای تکراری مانند نمایش لیست ها، مدیریت فرم ها و مدیریت عملیات CRUD با حداقل کد دیگ بخار فراهم می کند.

در اینجا برخی از موارد پرکاربرد آورده شده است:

  • DetailView – یک جزئیات را نمایش می دهد page برای یک شی واحد
  • ListView – فهرستی از اشیاء را ارائه می دهد.
  • CreateView – ایجاد یک شی جدید را مدیریت می کند و یک فرم را نمایش می دهد.
  • UpdateView – به روز رسانی یک شی موجود را مدیریت می کند.
  • DeleteView – فرمی برای حذف یک شی موجود ارائه می دهد.
  • TemplateView – یک قالب استاتیک را ارائه می دهد.
  • RedirectView – به یک URL دیگر هدایت می شود.
  • FormView – یک فرم را نمایش می دهد و پس از ارسال آن را پردازش می کند.

این نماها بسیاری از عملیات ها را ساده می کند، به طوری که توسعه دهندگان می توانند کارهای تکراری را با حداقل کد انجام دهند.

چگونه نماهای جنگو را سفارشی کنیم

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

سفارشی سازی FBV ها

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

from django.http import HttpResponse
from django.shortcuts import render
from .models import MyModel

def my_custom_view(request):
    if request.method == 'POST':
        # Handle POST request logic
        data = request.POST['data']
        # Do something with the data, e.g., saving to the database
        MyModel.objects.create(data_field=data)
        return HttpResponse("Data Saved!")

    # Additional custom logic for GET requests
    context = {'items': MyModel.objects.all()}
    return render(request, 'my_template.html', context)

در قطعه بالا، ارسال کنید داده ها را از فرم استخراج می کند، آنها را پردازش می کند – در این مورد، آن را در پایگاه داده ذخیره می کند – و پاسخی را برمی گرداند. در همین حال، دریافت کنید درخواست ها همه موارد را از پایگاه داده بازیابی می کنند، آنها را به الگو ارسال می کنند و رندر می کنند page.

همچنین می توانید از دکوراتورهایی مانند @login_required یا سفارشی برای رفتار خاص، مانند کنترل دسترسی. به عنوان مثال:

from django.contrib.auth.decorators import login_required

@login_required
def my_protected_view(request):
    # This view is only accessible to logged-in users
    return HttpResponse("Hello, authenticated user!")

سفارشی سازی CBV ها

CBV ها روشی ساختاریافته برای سفارشی کردن نماها با روش های نادیده گرفته شده، مانند دریافت () و پست (). در مثال زیر، روش سفارشی سازی CBV ها برای روش های مختلف درخواست را نشان می دهیم:

from django.views import View
from django.http import HttpResponse
from .models import MyModel

class MyCustomView(View):
    def get(self, request):
        # Custom logic for GET request
        items = MyModel.objects.all()
        return render(request, 'my_template.html', {'items': items})
    
    def post(self, request):
        # Custom logic for POST request
        data = request.POST['data']
        MyModel.objects.create(data_field=data)
        return HttpResponse("Data Saved!")

قطعه بالا از یک نمای پایه کلاس برای مدیریت هر دو استفاده می کند دریافت کنید و ارسال کنید درخواست ها، اجرای رفتار سفارشی برای هر نوع درخواست را آسان تر می کند

CBV های جنگو همچنین عملکردهای داخلی را برای عملیات رایج مانند فهرست کردن اشیا یا ایجاد یک فرم ارائه می دهند. شما می توانید رفتار آنها را با نادیده گرفتن متدهای کلاس مانند get_queryset():

from django.views.generic import ListView
from .models import MyModel

class MyFilteredListView(ListView):
    model = MyModel
    template_name="filtered_list.html"
    
    def get_queryset(self):
        # Customize the queryset to only include certain items
        return MyModel.objects.filter(active=True)

در مثال بالا، view مجموعه query را با فیلتر کردن مواردی که برمی گرداند سفارشی می کند، بنابراین فقط ورودی های فعال نمایش داده می شوند.

پیکربندی URL برای نماهای جنگو

بیایید ببینیم چگونه یک پروژه ساده ممکن است الگوهای URL جنگو را تنظیم کند:

  1. URL های سطح پروژه (myproject→urls.py)
from django.contrib import admin
from django.urls import path, include

urlpatterns = [
    path('admin/', admin.site.urls),  # Admin site
    path('', include('myapp.urls')),  # Include app-level URLs for "myapp"
]
  • مسیر() – الگوهای URL را به نماها یا سایر تنظیمات URL نگاشت می کند.
  • admin.site.urls – درخواست ها را به رابط مدیریت داخلی جنگو هدایت می کند.
  • شامل () – مسیریابی را به سطح برنامه واگذار می کند آدرس های اینترنتیpy فایل برای مدیریت URL مدولار.
  1. URL های سطح برنامه (myproject→myapp→urls.py)
from django.urls import path
from . import views

urlpatterns = [
    path('', views.homepage, name="home"),  # Maps the root URL to the homepage view
    path('about/', views.about, name="about"),  # Maps "/about/" to the about view
]
  • این root URL (به نمایندگی از ‘ ‘) به نقشه برداری شده است homepage مشاهده کنید.
  • این /about/ URL به در مورد نقشه برداری شده است مشاهده کنید.
پیشنهاد می‌کنیم بخوانید:  روش قرار دادن CSS Stylesheet در وردپرس با استفاده از wp_enqueue_style

افزودن FBV به الگوهای URL

در اینجا روش نمایش نماهای مربوطه آمده است دیدگاه هاpy برای پیکربندی URL بالا:

from django.shortcuts import render

def homepage(request):
    return render(request, 'homepage.html')

def about(request):
    return render(request, 'about.html')

FBV ها، homepage و در مورد، به الگوهای URL در سطح برنامه مرتبط هستند آدرس های اینترنتیpy، اطمینان حاصل شود که نمای صحیح برای هر URL فراخوانی شده است: http://example.com/ و http://example.com/about/.

افزودن CBV به الگوهای URL

همچنین می توانید URL ها را به CBV ها نگاشت کنید، که با آنها کمی متفاوت رفتار می شود. در اینجا یک مثال است:

from django.urls import path
from .views import HomePageView, AboutPageView

urlpatterns = [
    path('', HomePageView.as_view(), name="home"),
    path('about/', AboutPageView.as_view(), name="about"),
]

و نماهای کلاس محور مربوطه در دیدگاه هاpy:

from django.views.generic import TemplateView

class HomePageView(TemplateView):
    template_name="homepage.html"

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

این .as_view() متد نماهای مبتنی بر کلاس را به الگوهای URL پیوند می دهد.

مدیریت روش های HTTP با نماها

در اینجا روش مدیریت متفاوت FBV ها و CBV ها با روش های HTTP آورده شده است:

استفاده از FBV ها برای مدیریت روش های HTTP

FBV ها روش های HTTP را با بررسی صریح روش درخواست انجام می دهند درخواست.روش. شما می توانید منطق سفارشی را برای هر روش تعریف کنید، مانند دریافت کنید و ارسال کنید در همان تابع:

from django.http import HttpResponse
from django.shortcuts import render
from .models import MyModel

def my_view(request):
    if request.method == 'GET':
        # Logic for GET requests
        items = MyModel.objects.all()
        return render(request, 'my_template.html', {'items': items})
    elif request.method == 'POST':
        # Logic for POST requests
        data = request.POST.get('data')
        MyModel.objects.create(data_field=data)
        return HttpResponse("Data saved!")
    else:
        return HttpResponse("Unsupported HTTP method", status=405)

اینجا، درخواست.روش حاوی روش HTTP – دریافت کنید یا ارسال کنید – به عنوان یک رشته با این حال، باید روش های پشتیبانی نشده را به طور صریح مدیریت کنید.

استفاده از CBV ها برای مدیریت روش های HTTP

CBV ها مدیریت روش های HTTP را با ارائه روش های اختصاصی برای هر نوع درخواست ساده می کنند. جنگو به‌طور خودکار درخواست‌های دریافتی را به روش مناسب ارسال می‌کند و نیازی به بررسی‌های دستی مانند FBV‌ها را از بین می‌برد.

from django.views import View
from django.http import JsonResponse

class ExampleView(View):
    def get(self, request):
        return JsonResponse({'message': 'This is a GET response'})

    def post(self, request):
        data = request.POST.get('data', None)
        return JsonResponse({'message': f'Received POST with data: {data}'}, status=201)

    def delete(self, request):
        return JsonResponse({'message': 'DELETE request handled'}, status=204)

هر روشی مانند دریافت () و پست ()، یک تابع جداگانه است که منطق را تمیز و مدولار می کند. اگر روشی تعریف نشده باشد، جنگو با آن پاسخ می دهد روش 405 مجاز نیست به صورت خودکار

نتیجه گیری

نماهای جنگو ابزاری قدرتمند برای پردازش درخواست ها و ارائه پاسخ ها هستند. FBV ها سادگی و کنترل را ارائه می دهند که برای کارهای کوچکتر ایده آل است، در حالی که CBV ها ساختار و قابلیت استفاده مجدد را ارائه می دهند که برای منطق پیچیده عالی است.

درک روش مدیریت روش‌های HTTP و سفارشی‌سازی نماها به توسعه‌دهندگان اجازه می‌دهد برنامه‌های کارآمد و مقیاس‌پذیر بسازند.

با استفاده از ابزارهای داخلی جنگو مانند نماهای عمومی و ارسال روش، می توانید توسعه پروژه را ساده کنید، کدهای تمیز را حفظ کنید و تمرکز کنید. روی ایجاد تجربه های کاربری عالی

سوالات متداول مشاهده جنگو

تفاوت FBV و CBV در جنگو چیست؟

FBV ها توابع ساده ای برای رسیدگی به درخواست های HTTP هستند که برای نماهای ساده ایده آل هستند. CBV ها از برنامه نویسی شی گرا استفاده می کنند و ابزارهای ارثی و داخلی را برای کارهای پیچیده مانند CRUD ارائه می دهند. یادگیری FBV ها آسان تر است اما کمتر قابل استفاده مجدد است، در حالی که CBV ها ساختار و انعطاف پذیری بهتری را به قیمت منحنی یادگیری تندتر ارائه می دهند.

چه زمانی باید از FBV ها نسبت به CBV ها استفاده کنم؟

از FBV ها برای نماهای ساده و تک با منطق سفارشی استفاده کنید که با الگوهای استاندارد CRUD همسو نیستند. آنها برای نقاط پایانی API، کنترل کننده های وب هوک یا منحصر به فرد ایده آل هستند page منطق که در آن سادگی و وضوح کلیدی است. FBV ها همچنین یک نقطه شروع عالی برای مبتدیانی هستند که سیستم دید جنگو را یاد می گیرند.

آیا می توانم نماهای عمومی را در جنگو سفارشی کنم؟

بله، شما می‌توانید نماهای عمومی جنگو را با نادیده گرفتن روش‌های داخلی آن‌ها مانند get_queryset()، get_context_data()، یا form_valid(). همچنین می‌توانید میکس‌ها را برای عملکردهای اضافی اضافه کنید یا ویژگی‌هایی را تغییر دهید، مانند نام_قالب، مدل، و context_object_name متناسب با نیازهای خاص شما