QuerySets

جنگو

سلام

در این قسمت می خواهیم APIهای مدل ها را واکاوی کنیم. در ابتدا قصد داریم ویوی مربوط به صفحۀ اصلی را بهبود بخشیم.

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

  • نمایش تعداد پست های ارسالی در یک بورد.
  • نمایش تعداد تاپیک های ارسالی در یک بورد.
  • نمایش آخرین کاربری که پستی را ارسال نموده به همراه تاریخ و ساعت آن.

برای اینکار از ترمینال پایتون (و نه کدزنی مستقیم در برنامه) شروع می کنیم و سپس تغییرات لازم را در برنامه پیاده سازی می کنیم.

بهتر است پیش از استفاده از ترمینال پایتون برای تمام مدل های خود متد __str__ را اضافه کنیم.

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

در مدل پست از کلاس و ابزار Truncator استفاده می کنیم. با این کار می توانیم رشته های طولانی را به سایز مشخصی (در اینجا 30 کاراکتر) محدود و کوتاه کنیم.

بسیار عالی! ترمینال پایتون را باز می کنیم.

سپس درون شل دستورات زیر را وارد می کنیم.

راحت ترین کار برای انجام 3 هدف قبلی این است که تعداد تاپیک های فعلی را به دست آوریم. به خاطر اینکه تاپیک ها و بوردها مستقیما با هم در ارتباط اند.

اما تعداد پست های یک بورد نیاز به کمی حقه دارد! چراکه پست ها مستقیما با یک بورد در ارتباط نیستند.

ما در اینجا تعداد 11 پست داریم اما تمام آن ها به بورد «Django» تعلق ندارند. برای این کار به شیوۀ زیر پست ها را فیلتر می کنیم.

استفاده از دو علامت آندرلاین (__) پشت سر هم در topic__board برای بهره برداری از روابط تعریف‌شده میان مدل های مختلف است.

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

و حالا آخرین مأموریت ما آن است که آخرین پست ارسالی را مشخص کنیم.

و تمام…! حالا که همه چیز در شل پایتون درست کار می کند باید آن ها را به برنامۀ خود اضافه کنیم.

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

دقت کنید که از self استفاده کرده ایم. برای اینکه این متد توسط بورد استفاده خواهد شد و به این معنا خواهد بود که ما از این مورد برای فیلتر کردن کوئری خود استفاده خواهیم کرد.

گام بعدی بروزرسانی قالب صفحۀ خانه برای نمایش اطلاعات جدید است.

templates/home.html

و خروجی به شکل زیر خواهد شد:

نکته خیلی مهم: اگر در قطعه کد بالا تمام بوردها دارای تاپیک نباشند صفحه خطا می دهد که راه بر طرف کردن آن در ادامۀ همین آموزش آمده است…

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

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

templates/home.html

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

حل است!

من یک بورد جدید ولی بدون هیچ پیامی ایجاد کرده ام تا «پیام های خالی» را چک کنم.

حالا نوبت آن رسیده تا ویوی لیست تاپیک ها را بهبود دهیم.

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

مثل معمول با شل پایتون شروع می کنیم.

در اینجا از متد annotate در کوئری استفاده کرده ایم که با این کار یک ستون جدید به صورت موقتی و در هوا می سازیم.

این ستون جدید قرار است توسط topic.replies قابل دسترسی بوده و شامل تعداد پست های یک تاپیک باشد. فقط لازم است که یک ترمیم جزئی انجام دهیم چراکه تعداد پاسخ ها نباید شامل اولین پست (پست اصلی) شوند.

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

دیگه چی از این بهتر؟!

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

templates/topics.html (مشاهده کد کامل)

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

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

 

مطلب بعدی: مهاجرت

مطلب قبلی:ویوی پاسخ به پست

بدون دیدگاه

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

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

جنگو
صفحه بندی با استفاده از 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 …

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