صفحة المؤلفين
جزء من قسم النماذج ولوحة الإدارة في رحلة Django على Coddy. الدرس 22 من 23.
يحتوي رف كتبك على صفحة لكل كتاب، لكن ليس للمؤلفين. ينشئ هذا المشروع صفحةً انطلاقًا مما تعرفه: عرضًا يستعلم من قاعدة البيانات، وعنوان URL، وقالبًا يتبع العلاقات، وQuerySet لا ينفّذ استعلامًا لكل صف.
يُدرج كل مؤلف مع كتبه: حلقة تمر على المؤلفين، وداخلها حلقة تمر على كتب كل مؤلف. من دون مساعدة، تنفّذ الحلقة الداخلية استعلامًا واحدًا لكل مؤلف. لا يمكن لـ select_related() أن يساعد، لأن العلاقة من المؤلف إلى كتبه علاقة عكسية. أما نظيره، prefetch_related()، فيجلب الصفوف المرتبطة بكل عنصر في القائمة باستعلام إضافي واحد. يجلب Book.objects.prefetch_related("loans") قروض كل كتاب باستعلام إضافي واحد. وهو يأخذ اسم العلاقة.
توضح المهمة ما الذي يجب أن تفعله الصفحة؛ أما الشيفرة فهي من إعدادك.
التحدي
متوسطأنشئ صفحة للمؤلفين.
- في
books/views.py، اكتبauthor_list: اعرضbooks/author_list.htmlمع جميع المؤلفين، باستخدامprefetch_related(). - في
books/urls.py، أضفauthors/باسمauthors. - في
author_list.html، أنشئ لكل مؤلف<section class="author">: ضَع الاسم في<h2>، وعنصر<li>لكل كتاب يربط عنوانه بصفحته. - في
books/base.html، أضف رابطًا إلى المؤلفين في<header>.
انقر على المؤلفين: يعرض Herbert كتابَي Children of Dune وDune.
جرّب بنفسك
from django.shortcuts import get_object_or_404, render
from .models import Book
def home(request):
books = Book.objects.select_related("author")
return render(request, "books/home.html", {"books": books})
def book_detail(request, pk):
book = get_object_or_404(Book, pk=pk)
return render(request, "books/book_detail.html", {"book": book})
def search(request):
q = request.GET.get("q", "")
books = Book.objects.filter(title__icontains=q).select_related("author")
return render(request, "books/search.html", {"q": q, "books": books})
جميع دروس النماذج ولوحة الإدارة
تدرّب بنفسك: Playground لـ Django