از طریق منوی جستجو مطلب مورد نظر خود در وبلاگ را به سرعت پیدا کنید
روش استفاده از نماهای جنگو
سرفصلهای مطلب
نماهای جنگو یکی از اجزای کلیدی هر برنامه وب هستند که داده ها و رابط کاربری برنامه شما را پل می کنند.
هنگامی که پایگاه داده جنگو و مدلهای شما برای مدیریت دادهها راهاندازی شدند، نماها روش پردازش و ارائه این دادهها به کاربران را مشخص میکنند و منطق و ساختار پشت صفحات وب را تشکیل میدهند.
نما در جنگو چیست؟
نماهای جنگو یک جزء ضروری است که منطق روش پاسخگویی برنامه شما به درخواست های کاربر را کنترل می کند.
به بیان ساده، یک 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 ها روی بیاورند.
نماهای عمومی داخلی در جنگو
نماهای عمومی داخلی جنگو راهی برای مدیریت الگوهای تکراری مانند نمایش لیست ها، مدیریت فرم ها و مدیریت عملیات 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 جنگو را تنظیم کند:
- 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 مدولار.
- 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 به در مورد نقشه برداری شده است مشاهده کنید.
افزودن 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 متناسب با نیازهای خاص شما
لطفا در صورت وجود مشکل در متن یا مفهوم نبودن توضیحات، از طریق دکمه گزارش نوشتار یا درج نظر روی این مطلب ما را از جزییات مشکل مشاهده شده مطلع کنید تا به آن رسیدگی کنیم
زمان انتشار: 1403-12-26 03:28:12