تست ویوی بروزرسانی

سلام

درون فولدر boards/tests یک فایل با نام test_view_edit_post.py ایجاد می کنیم. قسمتی که باید تغییر کرده و اضافه شود به شکل زیر است.

boards/tests/test_view_edit_post.py (مشاهده کد کامل)

فعلاً مهم ترین بخش PostUpdateViewTestCase به عنوان کلاسی است که برای استفاده چند باره میان سایر موارد تست تعریف شده است. این مورد شامل تنظیمات اولیه، ساخت کاربران، تاپیک ها، بوردها و… است.

کلاس LoginRequiredPostUpdateViewTests بررسی می کند که آیا ویوی مربوطه با دکوراتور login_required@ محافظت شده است یا خیر. همانطور که می دانید فقط کاربران معتبر امکان دسترسی به این صفحه را دارند.

کلاس UnauthorizedPostUpdateViewTests یک کاربر جدید ایجاد می کند. کاربری که با نویسنده و ایجاد کنندۀ پست متفاوت بوده و سپس تلاش می کند به قسمت ویرایش صفحه وارد شود. طبیعی است که برنامه فقط به کاربری اجازه تغییر و ویرایش پست را می دهد که آن پست توسط همان کاربر ایجاد شده باشد.

تست را اجرا می کنیم:

اول از همه مشکل بوجودآمده با دکوراتور login_required@ را حل می کنیم. روش استفاده از دکوراتورهای ویو در ویوهای مبتنی بر کلاس کمی متفاوت بوده و به importهای اضافه نیاز است.

boards/views.py (مشاهده کد کامل)

کلاس ها را نمی توان مستقیما با دکوراتور login_required@ محدود کرد. برای این کار باید از ابزار method_decorator@ استفاده کرده و در این ابزار دکوراتور یا دکوراتورهای خود را به کلاس معرفی و بگوییم کدام متد نیاز به محدودسازی و دکورشدن دارد.

در ویوهای مبتنی بر کلاس استفاده از متد dispatch به عنوان دکوراتور، مرسوم و رایج است. این مورد یک متد داخلی در جنگو است که در کلاس ویو تعریف شده است. تمام درخواست ها از این متد عبور می کنند. یعنی ما می گوییم که دکوراتور login_required@ را روی متد dispach اعمال کن و از طرفی تمام متدها هم از dispatch عبور کرده و به این ترتیب مثل این است که دکوراتور login_required@را قبل از تمام متدها قرار داده باشیم.

فرمان تست را اجرا می کنیم.

اوکی! مشکل login_required@ را حل کردیم. حالا مشکل ویرایش تمام پست ها توسط هر کاربر را داریم.

بهترین راه برای حل این مشکل توقف سازی متد get_queryset در UpdateView است. متد اصلی را می توانید در لینک UpdateView#get_queryset مشاهده کنید.

boards/views.py (مشاهده کد کامل)

در خط ()queryset = super().get_queryset از متد get_queryset از کلاس والد استفاده دوباره کرده ایم و کلاس والد همان کلاس UpateView است.

سپس به کوئری ست خود یک فیلتر اضافه می کنیم که به واسطۀ این فیلتر پست ها را بر اساس کاربری که وارد سیستم شده غربال کرده و در شی request قابل دسترسی است.

دوباره تست می کنیم.

ایول!!

ترجمۀ اختصاصی توسط تمدن

 

مطلب بعدی: ویوی لیست | List View

مطلب قبلی: ویوی بروزرسانی | Update View

بدون دیدگاه

پاسخی بگذارید

نشانی ایمیل شما منتشر نخواهد شد. بخش‌های موردنیاز علامت‌گذاری شده‌اند *

جنگو
صفحه بندی با استفاده از FBV

سلام کد زیر مربوط به پیاده سازی صفحه بندی با استفاده از توابع است. boards/views.py (مشاهده کد کامل) from django.db.models import Count from django.core.paginator import Paginator, EmptyPage, PageNotAnInteger from django.shortcuts import get_object_or_404, render from django.views.generic import ListView from .models import Board def board_topics(request, pk): board = get_object_or_404(Board, pk=pk) queryset = …

جنگو
صفحه بندی و شماره گذاری صفحات

سلام این کار با استفاده از CBV بسیار آسان است. اما قبل از آن می خواهیم صفحه بندی مطالب را به صورت دستی انجام دهیم تا از مکانیسم واقعی آن آگاهی پیدا کنی و سپس از تکنولوژی CBV بهره برداری می کنیم. از الآن به بعد روی ویوی board_topics کار …

جنگو
ویوی لیست | List View

سلام با بازتعریف ویوی قبلی می توانیم از مزایای CBV بهره مند شویم. در این مثال می خواهیم صفحۀ اصلی را تغییر دهیم. در این صفحه ما صرفا تمام بوردها را از دیتابیس گرفته و در HTML لیست می کنیم. boards/views.py from django.shortcuts import render from .models import Board def …

هرگونه استفادۀ از این آموزش به صورت رایگان و با ارجاع به تمدن جایز است.