Ð ÑководÑÑво ÑаÑÑÑ 6: ÐÑобÑажение ÑпиÑков и деÑалÑной инÑоÑмаÑии
ÐÐ°Ð½Ð½Ð°Ñ ÑаÑÑÑ ÑаÑÑиÑÑÐµÑ Ð½Ð°Ñ ÑÐ°Ð¹Ñ LocalLibrary, добавлÑÑ Ð² него ÑпиÑки и ÑÑÑаниÑÑ, пÑÑÑм пÑедоÑÑÐ°Ð²Ð»ÐµÐ½Ð¸Ñ Ð¿Ð¾Ð´Ñобной инÑоÑмаÑии о ÐºÐ½Ð¸Ð³Ð°Ñ Ð¸ авÑоÑÐ°Ñ . Ð ÑекÑÑей ÑаÑÑи Ð¼Ñ Ð¿Ð¾Ð´Ñобно изÑÑим обобÑÑннÑе базовÑе клаÑÑÑ Ð¾ÑобÑÐ°Ð¶ÐµÐ½Ð¸Ñ Ð¸ покажем как они могÑÑ ÑÑÑеÑÑвенно ÑокÑаÑиÑÑ ÐºÐ¾Ð»Ð¸ÑеÑÑво кода, коÑоÑÑй Ð²Ñ Ð´Ð¾Ð»Ð¶Ð½Ñ Ð±Ñли Ð±Ñ Ð½Ð°Ð¿Ð¸ÑаÑÑ Ð² обÑÑной ÑиÑÑаÑии. ÐÑоме Ñого, Ð¼Ñ Ð±Ð¾Ð»ÐµÐµ подÑобно ÑаÑÑмоÑÑим ÑпÑавление и наÑÑÑойки URL-адÑеÑов, показÑÐ²Ð°Ñ ÐºÐ°Ðº вÑполниÑÑ Ð¿ÑоÑÑое ÑопоÑÑавление какой-либо ÑÑÑоки паÑÑеÑÐ½Ñ ÑегÑлÑÑного вÑÑажениÑ.
| ТÑебованиÑ: | ÐавеÑÑиÑÑ Ð²Ñе пÑедÑдÑÑие ÑаÑÑи ÑÑководÑÑва, вклÑÑÐ°Ñ Ð ÑководÑÑво Django ЧаÑÑÑ 5: Создание домаÑней ÑÑÑаниÑÑ. |
|---|---|
| ЦелÑ: | ÐонимаÑÑ Ð³Ð´Ðµ и как пÑименÑÑÑ Ð¾Ð±Ð¾Ð±ÑÑннÑе базовÑе клаÑÑÑ Ð¾ÑобÑажениÑ, и как пÑименÑÑÑ Ð¿Ð°ÑÑеÑÐ½Ñ URL-адÑеÑов Ð´Ð»Ñ Ð¿ÐµÑедаÑи инÑоÑмаÑии в оÑобÑажениÑ. |
ÐбзоÑ
Рданном ÑÑководÑÑве Ð¼Ñ Ð·Ð°Ð²ÐµÑÑим пеÑвÑÑ Ð²ÐµÑÑÐ¸Ñ ÑайÑа LocalLibrary, Ñ Ð¿Ð¾Ð¼Ð¾ÑÑÑ Ð´Ð¾Ð±Ð°Ð²Ð»ÐµÐ½Ð¸Ñ ÑÑÑаниÑÑ Ð¿ÐµÑеÑиÑÐ»ÐµÐ½Ð¸Ñ Ð¸ подÑобной инÑоÑмаÑии о ÐºÐ½Ð¸Ð³Ð°Ñ Ð¸ авÑоÑÐ°Ñ (или, еÑли бÑÑÑ Ð±Ð¾Ð»ÐµÐµ ÑоÑнÑми, Ð¼Ñ Ð¿Ð¾ÐºÐ°Ð¶ÐµÐ¼ как вам ÑеализоваÑÑ ÑооÑвеÑÑÑвÑÑÑие ÑÑÑаниÑÑ Ð´Ð»Ñ ÐºÐ½Ð¸Ð³, а Ð´Ð»Ñ Ð°Ð²ÑоÑов Ð²Ñ ÑможеÑе ÑделаÑÑ Ð¸Ñ ÑамоÑÑоÑÑелÑно!)
ÐаннÑй пÑоÑеÑÑ Ð¿Ð¾Ñ Ð¾Ð¶ на Ñоздание главной ÑÑÑаниÑÑ ÑайÑа, коÑоÑÑй Ð¼Ñ Ð¿Ð¾ÐºÐ°Ð·Ñвали в пÑедÑдÑÑей ÑаÑÑи ÑÑководÑÑва. Ðам вÑе Ñакже надо ÑоздаÑÑ URL-пÑеобÑазованиÑ, оÑобÑÐ°Ð¶ÐµÐ½Ð¸Ñ Ð¸ ÑÐ°Ð±Ð»Ð¾Ð½Ñ ÑÑÑаниÑ. ÐÑновнÑм оÑлиÑием бÑÐ´ÐµÑ Ñо, ÑÑо Ð´Ð»Ñ ÑÑÑÐ°Ð½Ð¸Ñ Ð¿Ð¾Ð´Ñобной инÑоÑмаÑии пеÑед нами вÑÑÐ°Ð½ÐµÑ Ð´Ð¾Ð¿Ð¾Ð»Ð½Ð¸ÑелÑÐ½Ð°Ñ Ð·Ð°Ð´Ð°Ñа полÑÑÐµÐ½Ð¸Ñ Ð¸Ð½ÑоÑмаÑии из паÑÑеÑна URL-адÑеÑа и пеÑедаÑи ÐµÑ Ð¾ÑобÑажениÑ. ÐÐ»Ñ ÑÑÐ¸Ñ ÑÑÑÐ°Ð½Ð¸Ñ Ð¼Ñ ÑобиÑаемÑÑ Ð¿ÑодемонÑÑÑиÑоваÑÑ ÑовеÑÑенно дÑÑгой Ñип оÑобÑажениÑ, оÑнованнÑй на пÑименении обобÑÑннÑÑ ÐºÐ»Ð°ÑÑов оÑобÑÐ°Ð¶ÐµÐ½Ð¸Ñ ÑпиÑка и деÑалÑной инÑоÑмаÑии о запиÑи. ÐÑо Ð¼Ð¾Ð¶ÐµÑ ÑÑÑеÑÑвенно ÑокÑаÑиÑÑ ÐºÐ¾Ð»Ð¸ÑеÑÑво кода, Ð½ÐµÐ¾Ð±Ñ Ð¾Ð´Ð¸Ð¼Ð¾Ð³Ð¾ Ð´Ð»Ñ Ð¾ÑобÑÐ°Ð¶ÐµÐ½Ð¸Ñ Ð¸ ÑÐ´ÐµÐ»Ð°ÐµÑ ÐµÐ³Ð¾ (код) более пÑоÑÑÑм Ð´Ð»Ñ Ð½Ð°Ð¿Ð¸ÑÐ°Ð½Ð¸Ñ Ð¸ поддеÑжки.
ÐавеÑÑаÑÑÐ°Ñ ÑаÑÑÑ Ð´Ð°Ð½Ð½Ð¾Ð³Ð¾ ÑÑководÑÑва бÑÐ´ÐµÑ Ð¿Ð¾ÑвÑÑена демонÑÑÑаÑии поÑÑÑаниÑного показа ваÑÐ¸Ñ Ð´Ð°Ð½Ð½ÑÑ (pagination) пÑи пÑименении обобÑÑнного клаÑÑа оÑобÑÐ°Ð¶ÐµÐ½Ð¸Ñ ÑпиÑка.
СÑÑаниÑа Ñо ÑпиÑком книг
СÑÑаниÑа Ñо ÑпиÑком книг показÑÐ²Ð°ÐµÑ Ð²Ñе книги в налиÑии и бÑÐ´ÐµÑ Ð´Ð¾ÑÑÑпна по адÑеÑÑ: catalog/books/. ÐÑа ÑÑÑаниÑа Ð´Ð»Ñ ÐºÐ°Ð¶Ð´Ð¾Ð¹ запиÑи вÑÐ²Ð¾Ð´Ð¸Ñ Ð·Ð°Ð³Ð¾Ð»Ð¾Ð²Ð¾Ðº и авÑоÑа, пÑи ÑÑом каждÑй заголовок ÑвлÑеÑÑÑ Ð³Ð¸Ð¿ÐµÑÑÑÑлкой на ÑооÑвеÑÑÑвÑÑÑÑÑ ÑÑÑаниÑÑ Ð¿Ð¾Ð´Ñобной инÑоÑмаÑии о книге. ÐÐ°Ð½Ð½Ð°Ñ ÑÑÑаниÑа бÑÐ´ÐµÑ Ð¸Ð¼ÐµÑÑ ÑÑ Ð¶Ðµ ÑÑÑÑкÑÑÑÑ Ð¸ навигаÑÐ¸Ñ ÐºÐ°Ðº и вÑе оÑÑалÑнÑе ÑÑÑаниÑÑ ÑайÑа, Ñаким обÑазом Ð¼Ñ Ñможем ÑаÑÑиÑиÑÑ Ð±Ð°Ð·Ð¾Ð²Ñй Ñаблон ÑайÑа (base_generic.html), коÑоÑÑй Ð¼Ñ Ñоздали в пÑедÑдÑÑей ÑаÑÑи ÑÑководÑÑва.
ÐÑеобÑÐ°Ð·Ð¾Ð²Ð°Ð½Ð¸Ñ URL-адÑеÑов
ÐÑкÑойÑе Ñайл /catalog/urls.py и ÑкопиÑÑйÑе в него пÑÑÑ Ð´Ð¾ 'books/', как в пÑимеÑе ниже. ÐÑакÑиÑеÑки Ñак же, как и Ð´Ð»Ñ Ð³Ð»Ð°Ð²Ð½Ð¾Ð¹ ÑÑÑаниÑÑ ÑайÑа, ÑÑнкÑÐ¸Ñ path() опÑеделÑÐµÑ ÑегÑлÑÑное вÑÑажение, по коÑоÑÐ¾Ð¼Ñ Ð¿ÑовеÑÑеÑÑÑ Ð°Ð´ÑÐµÑ ('books/'), ÑÑнкÑÐ¸Ñ Ð¾ÑобÑажениÑ, коÑоÑÐ°Ñ Ð²ÑзовеÑÑÑ Ð¿Ñи Ñовпадении адÑеÑов (views.BookListView.as_view()), и название Ð´Ð»Ñ ÑÑого конкÑеÑного пÑеобÑазованиÑ.
urlpatterns = [
path('', views.index, name='index'),
path('books/', views.BookListView.as_view(), name='books'),
]
Ðак бÑло оÑмеÑено в пÑедÑдÑÑей ÑаÑÑи ÑÑководÑÑва, URL-адÑÐµÑ Ñже должен ÑодеÑжаÑÑ /catalog, и Ñаким обÑазом полнÑй адÑеÑ, на Ñамом деле, Ð¸Ð¼ÐµÐµÑ Ð²Ð¸Ð´ /catalog/books/.
ФÑнкÑÐ¸Ñ Ð¾ÑобÑÐ°Ð¶ÐµÐ½Ð¸Ñ Ð¸Ð¼ÐµÐµÑ Ð´ÑÑгой ÑоÑмаÑ, Ñем пÑежде â ÑÑо ÑвÑзано Ñ Ñем, ÑÑо данное оÑобÑажение ÑеализÑеÑÑÑ ÑеÑез клаÑÑ. ÐÑ Ð±Ñдем наÑледоваÑÑÑÑ Ð¾Ñ ÑÑÑеÑÑвÑÑÑей обÑей ÑÑнкÑии из view, коÑоÑÐ°Ñ Ñже Ð´ÐµÐ»Ð°ÐµÑ Ð±Ð¾Ð»ÑÑÑÑ ÑаÑÑÑ Ñого, ÑÑо Ð¼Ñ Ñ Ð¾Ñим, вмеÑÑо Ñого, ÑÑÐ¾Ð±Ñ Ð¿Ð¸ÑаÑÑ ÑÐ²Ð¾Ñ ÑобÑÑвеннÑÑ ÑÑнкÑÐ¸Ñ Ð²Ð¾ view Ñ Ð½ÑлÑ.
ÐÑи иÑполÑзовании обобÑÑннÑÑ
клаÑÑов оÑобÑÐ°Ð¶ÐµÐ½Ð¸Ñ Ð² Django Ð¼Ñ Ð¿Ð¾Ð»ÑÑаем доÑÑÑп к ÑооÑвеÑÑÑвÑÑÑей ÑÑнкÑии оÑобÑÐ°Ð¶ÐµÐ½Ð¸Ñ Ð¿Ñи помоÑи вÑзова меÑода as_view(). Таким обÑазом вÑполнÑеÑÑÑ Ð²ÑÑ ÑабоÑа по ÑÐ¾Ð·Ð´Ð°Ð½Ð¸Ñ ÑкземплÑÑа клаÑÑа и гаÑанÑиÑÑеÑÑÑ Ð²Ñзов пÑавилÑнÑÑ
меÑодов Ð´Ð»Ñ Ð²Ñ
одÑÑиÑ
HTTP-запÑоÑов.
ÐÑобÑажение (на оÑнове базового клаÑÑа)
ÐÑ Ð¼Ð¾Ð³Ð»Ð¸ Ð±Ñ Ð´Ð¾ÑÑаÑоÑно пÑоÑÑо ÑеализоваÑÑ Ð¾ÑобÑажение ÑпиÑка книг пÑи помоÑи обÑÑной ÑÑнкÑии (Ñакже, как Ð¼Ñ Ñделали ÑÑо Ð´Ð»Ñ Ð³Ð»Ð°Ð²Ð½Ð¾Ð¹ ÑÑÑаниÑÑ ÑайÑа), коÑоÑÐ°Ñ Ð´Ð¾Ð»Ð¶Ð½Ñ Ð±Ñла Ð±Ñ Ð²ÑполниÑÑ Ð·Ð°Ð¿ÑÐ¾Ñ Ð¿Ð¾Ð»ÑÑÐµÐ½Ð¸Ñ Ð²ÑеÑ
книг из Ð±Ð°Ð·Ñ Ð´Ð°Ð½Ð½ÑÑ
, заÑем вÑзваÑÑ ÑÑнкÑÐ¸Ñ render(), в коÑоÑÑÑ Ð¿ÐµÑедаÑÑ Ð´Ð°Ð½Ð½Ñй ÑпиÑок, в ÑооÑвеÑÑÑвÑÑÑий Ñаблон ÑÑÑаниÑÑ. Тем не менее, вмеÑÑо ÑÑо Ð¼Ñ Ð±Ñдем иÑполÑзоваÑÑ Ð¾Ð±Ð¾Ð±ÑÑннÑй клаÑÑ Ð¾ÑобÑÐ°Ð¶ÐµÐ½Ð¸Ñ ÑпиÑка â клаÑÑ, коÑоÑÑй наÑледÑеÑÑÑ Ð¾Ñ ÑÑÑеÑÑвÑÑÑего оÑобÑÐ°Ð¶ÐµÐ½Ð¸Ñ (ListView). ÐоÑколÑÐºÑ Ð¾Ð±Ð¾Ð±ÑÑннÑй клаÑÑ Ñже ÑеализÑÐµÑ Ð±Ð¾Ð»ÑÑÑÑ ÑаÑÑÑ Ñого, ÑÑо нам нÑжно, и ÑледÑÑ Ð»ÑÑÑим пÑакÑикам Django, Ð¼Ñ Ñможем ÑоздаÑÑ Ð±Ð¾Ð»ÐµÐµ ÑÑÑекÑивнÑй ÑпиÑок пÑи помоÑи менÑÑего колиÑеÑÑва кода, менÑÑего колиÑеÑÑва повÑоÑений и гоÑаздо лÑÑÑей поддеÑжкой.
ÐÑкÑойÑе catalog/views.py и ÑкопиÑÑйÑе ÑледÑÑÑий код, в нижнÑÑ ÑаÑÑÑ Ð´Ð°Ð½Ð½Ð¾Ð³Ð¾ Ñайла:
from django.views import generic
class BookListView(generic.ListView):
model = Book
ÐÑо вÑÑ! ÐбобÑÑнное оÑобÑажение вÑÐ¿Ð¾Ð»Ð½Ð¸Ñ Ð·Ð°Ð¿ÑÐ¾Ñ Ðº базе даннÑÑ
, полÑÑÐ¸Ñ Ð²Ñе запиÑи заданной модели (Book), заÑем оÑÑендеÑÐ¸Ñ (оÑÑиÑÑеÑ) ÑооÑвеÑÑÑвÑÑÑий Ñаблон, ÑаÑположеннÑй в /locallibrary/catalog/templates/catalog/book_list.html (коÑоÑÑй Ð¼Ñ Ñоздадим позже). ÐнÑÑÑи данного Ñаблона Ð²Ñ Ð¼Ð¾Ð¶ÐµÑе полÑÑиÑÑ Ð´Ð¾ÑÑÑп к ÑпиÑÐºÑ ÐºÐ½Ð¸Ð³ пÑи помоÑи пеÑеменной Ñаблона object_list ÐÐÐ book_list (еÑли обобÑиÑÑ, Ñо "the_model_name_list").
ÐÑимеÑание:
ÐÑоÑ, вÑглÑдÑÑий ÑÑÑанно, пÑÑÑ Ðº ÑÐ°Ð¹Ð»Ñ Ñаблона не ÑвлÑеÑÑÑ Ð¾Ð¿ÐµÑаÑкой â обобÑÑнное оÑобÑажение иÑÐµÑ Ñайл Ñаблона /application_name/the_model_name_list.html (catalog/book_list.html, в данном ÑлÑÑае) внÑÑÑи диÑекÑоÑии пÑÐ¸Ð»Ð¾Ð¶ÐµÐ½Ð¸Ñ /application_name/templates/ (Ñ Ð½Ð°Ñ - /catalog/templates/).
ÐÑ Ð¼Ð¾Ð¶ÐµÑе иÑполÑзоваÑÑ Ð°ÑÑибÑÑÑ Ð´Ð»Ñ Ñого, ÑÑÐ¾Ð±Ñ Ð¸Ð·Ð¼ÐµÐ½Ð¸ÑÑ Ð¿Ð¾Ð²ÐµÐ´ÐµÐ½Ð¸Ðµ по ÑмолÑаниÑ. ÐапÑимеÑ, Ð²Ñ Ð¼Ð¾Ð³Ð»Ð¸ Ð±Ñ ÑказаÑÑ Ð´ÑÑгой Ñайл Ñаблона, напÑимеÑ, еÑли в ваÑем ÑаÑпоÑÑжении имееÑÑÑ Ð½ÐµÑколÑко оÑобÑажений, коÑоÑÑе иÑполÑзÑÑÑ Ð¾Ð´Ð½Ñ Ð¸ ÑÑ Ð¶Ðµ моделÑ, или вам позаÑез заÑ
оÑелоÑÑ Ð±Ñ Ð¸ÑполÑзоваÑÑ Ð´ÑÑгое Ð¸Ð¼Ñ Ð¿ÐµÑеменной Ñаблона, еÑли book_list не ÑвлÑеÑÑÑ Ð¸Ð½ÑÑиÑивно понÑÑнÑм. Ðозможно, наиболее полезнÑм ваÑианÑом ÑвлÑеÑÑÑ Ð¸Ð·Ð¼ÐµÐ½ÐµÐ½Ð¸Ðµ/оÑÑилÑÑÑованнÑе ÑезÑлÑÑаÑа запÑоÑа к базе даннÑÑ
â Ñаким обÑазом, вмеÑÑо пеÑеÑиÑÐ»ÐµÐ½Ð¸Ñ Ð²ÑеÑ
книг Ð²Ñ Ð¼Ð¾Ð³Ð»Ð¸ Ð±Ñ Ð¿Ð¾ÐºÐ°Ð·ÑваÑÑ 5 наиболее попÑлÑÑнÑÑ
.
class BookListView(generic.ListView):
model = Book
context_object_name = 'my_book_list' # ваÑе ÑобÑÑвенное Ð¸Ð¼Ñ Ð¿ÐµÑеменной конÑекÑÑа в Ñаблоне
queryset = Book.objects.filter(title__icontains='war')[:5] # ÐолÑÑение 5 книг, ÑодеÑжаÑиÑ
Ñлово 'war' в заголовке
template_name = 'books/my_arbitrary_template_name_list.html' # ÐпÑеделение имени ваÑего Ñаблона и его ÑаÑположениÑ
ÐеÑеопÑеделение меÑодов в клаÑÑÐ°Ñ Ð¾ÑобÑажениÑ
Ðока ÑÑо вам не пÑÐ¸Ñ Ð¾Ð´Ð¸Ð»Ð¾ÑÑ ÑÑого делаÑÑ, но Ñ Ð²Ð°Ñ Ð¸Ð¼ÐµÐµÑÑÑ Ð²Ð¾Ð·Ð¼Ð¾Ð¶Ð½Ð¾ÑÑÑ Ð¿ÐµÑеопÑеделÑÑÑ Ð½ÐµÐºÐ¾ÑоÑÑе меÑÐ¾Ð´Ñ ÐºÐ»Ð°ÑÑа оÑобÑажениÑ.
ÐапÑимеÑ, Ð¼Ñ Ð¼Ð¾Ð¶ÐµÐ¼ пеÑеопÑеделиÑÑ Ð¼ÐµÑод полÑÑÐµÐ½Ð¸Ñ ÑпиÑка вÑеÑ
запиÑей get_queryset(). ÐаннÑй подÑ
од ÑвлÑеÑÑÑ Ð±Ð¾Ð»ÐµÐµ гибким, Ñем иÑполÑзование аÑÑибÑÑа queryset, как Ð¼Ñ Ñделали в пÑедÑдÑÑем ÑÑагменÑе кода (Ñ
оÑÑ, в данном ÑлÑÑае и Ð½ÐµÑ Ð½Ð¸ÐºÐ°ÐºÐ¾Ð¹ ÑазниÑÑ):
class BookListView(generic.ListView):
model = Book
def get_queryset(self):
return Book.objects.filter(title__icontains='war')[:5] # ÐолÑÑиÑÑ 5 книг, ÑодеÑжаÑиÑ
'war' в заголовке
ÐÑ Ñакже могли Ð±Ñ Ð¿ÐµÑеопÑеделиÑÑ Ð¼ÐµÑод get_context_data() Ð´Ð»Ñ Ñого, ÑÑÐ¾Ð±Ñ Ð² конÑекÑÑе (в пеÑеменной конÑекÑÑа) пеÑедаваÑÑ ÑÐ°Ð±Ð»Ð¾Ð½Ñ Ð´Ð¾Ð¿Ð¾Ð»Ð½Ð¸ÑелÑнÑе пеÑеменнÑе (напÑимеÑ, ÑпиÑок книг пеÑедаÑÑÑÑ Ð¿Ð¾ ÑмолÑаниÑ). ФÑагменÑ, пÑедÑÑавленнÑй ниже, показÑÐ²Ð°ÐµÑ ÐºÐ°Ðº добавиÑÑ Ð¿ÐµÑеменнÑÑ Ñ Ð¸Ð¼ÐµÐ½ÐµÐ¼ "some_data" в конÑекÑÑ (заÑем она бÑÐ´ÐµÑ Ð´Ð¾ÑÑÑпна как пеÑÐµÐ¼ÐµÐ½Ð½Ð°Ñ Ñаблона).
class BookListView(generic.ListView):
model = Book
def get_context_data(self, **kwargs):
# РпеÑвÑÑ Ð¾ÑеÑÐµÐ´Ñ Ð¿Ð¾Ð»ÑÑаем базовÑÑ ÑеализаÑÐ¸Ñ ÐºÐ¾Ð½ÑекÑÑа
context = super(BookListView, self).get_context_data(**kwargs)
# ÐобавлÑем новÑÑ Ð¿ÐµÑеменнÑÑ Ðº конÑекÑÑÑ Ð¸ иниÑиализиÑÑем ÐµÑ Ð½ÐµÐºÐ¾ÑоÑÑм знаÑением
context['some_data'] = 'This is just some data'
return context
РпÑоÑеÑÑе вÑÐ¿Ð¾Ð»Ð½ÐµÐ½Ð¸Ñ Ð²Ñего ÑÑого важно пÑидеÑживаÑÑÑÑ Ð¾Ð¿ÑеделÑнной поÑледоваÑелÑноÑÑи дейÑÑвий:
- РпеÑвÑÑ Ð¾ÑеÑÐµÐ´Ñ - полÑÑиÑÑ ÑÑÑеÑÑвÑÑÑий конÑекÑÑ Ð¸Ð· наÑего ÑÑпеÑклаÑÑа.
- ÐаÑем добавиÑÑ Ð² конÑекÑÑ Ð½Ð¾Ð²ÑÑ Ð¸Ð½ÑоÑмаÑиÑ.
- ÐаÑем веÑнÑÑÑ Ð½Ð¾Ð²Ñй (обновлÑннÑй) конÑекÑÑ.
ÐÑимеÑание: ÐоÑмоÑÑиÑе ÐÑÑÑоеннÑе обобÑÑннÑе клаÑÑÑ Ð¾ÑобÑÐ°Ð¶ÐµÐ½Ð¸Ñ (Django docs) Ð´Ð»Ñ Ð¾Ð·Ð½Ð°ÐºÐ¾Ð¼Ð»ÐµÐ½Ð¸Ñ Ñ Ð±Ð¾Ð»ÑÑим колиÑеÑÑвом пÑимеÑов Ñого, ÑÑо Ð²Ñ Ð¼Ð¾Ð³Ð»Ð¸ Ð±Ñ ÑделаÑÑ.
Создание Ñаблона ÐÑобÑÐ°Ð¶ÐµÐ½Ð¸Ñ Ð¡Ð¿Ð¸Ñка
СоздайÑе HTML-Ñайл /locallibrary/catalog/templates/catalog/book_list.html и ÑкопиÑÑйÑе в него ÑекÑÑ, ÑказаннÑй ниже. Ðак бÑло оÑмеÑено Ñанее, ÑÑо Ñайл Ñаблона по ÑмолÑаниÑ, коÑоÑÑй бÑÐ´ÐµÑ "иÑкаÑÑ" обобÑÑннÑй клаÑÑ Ð¾ÑобÑÐ°Ð¶ÐµÐ½Ð¸Ñ ÑпиÑка (Ð´Ð»Ñ Ð¼Ð¾Ð´ÐµÐ»Ð¸ Ñ Ð¸Ð¼ÐµÐ½ÐµÐ¼ Book в пÑиложении Ñ Ð¸Ð¼ÐµÐ½ÐµÐ¼ catalog).
Ð¨Ð°Ð±Ð»Ð¾Ð½Ñ Ð´Ð»Ñ Ð¾Ð±Ð¾Ð±ÑÑннÑÑ
оÑобÑажений Ñакие же как вÑе оÑÑалÑнÑе ÑÐ°Ð±Ð»Ð¾Ð½Ñ (Ñ
оÑÑ, еÑÑеÑÑвенно, пеÑедаваемÑе в ниÑ
конÑекÑÑ, или инÑоÑмаÑÐ¸Ñ Ð¼Ð¾Ð³ÑÑ Ð¾ÑлиÑаÑÑÑÑ). Так же как и Ñ Ð½Ð°Ñим Ñаблоном Ð´Ð»Ñ Ð³Ð»Ð°Ð²Ð½Ð¾Ð¹ ÑÑÑаниÑÑ, в пеÑвой ÑÑÑоке Ð¼Ñ ÑаÑÑиÑÑем Ð½Ð°Ñ Ð±Ð°Ð·Ð¾Ð²Ñй Ñаблон, а заÑем опÑеделÑем и замеÑаем блок Ñ Ð¸Ð¼ÐµÐ½ÐµÐ¼ content.
{% extends "base_generic.html" %}
{% block content %}
<h1>Book List</h1>
{% if book_list %}
<ul>
{% for book in book_list %}
<li>
<a href="{{ book.get_absolute_url }}">{{ book.title }}</a> ({{book.author}})
</li>
{% endfor %}
</ul>
{% else %}
<p>There are no books in the library.</p>
{% endif %}
{% endblock %}
Ðо ÑмолÑÐ°Ð½Ð¸Ñ Ð¾ÑобÑажение пеÑедаÑÑ ÐºÐ¾Ð½ÑекÑÑ (ÑпиÑок книг) как object_list и book_list (ÑинонимÑ; оба ваÑианÑа бÑдÑÑ ÑабоÑаÑÑ).
УÑловнÑе веÑвлениÑ
ÐÑ Ð¿ÑименÑем Ñеги Ñаблона if, else и endif Ð´Ð»Ñ Ñого, ÑÑÐ¾Ð±Ñ Ð¿ÑовеÑиÑÑ Ð¾Ð¿Ñеделена ли пеÑÐµÐ¼ÐµÐ½Ð½Ð°Ñ book_list и ÑодеÑÐ¶Ð¸Ñ Ð»Ð¸ она даннÑе. ÐÑли ÑпиÑок ÐРпÑÑÑ, Ñогда Ð¼Ñ Ð²ÑполнÑем иÑеÑаÑии по ÑпиÑÐºÑ ÐºÐ½Ð¸Ð³. ÐÑли ÑпиÑок пÑÑÑ (else-ÑлÑÑай) Ñогда Ð¼Ñ Ð¿Ð¾ÐºÐ°Ð·Ñваем ÑекÑÑ, поÑÑнÑÑÑий, ÑÑо в налиÑии Ð½ÐµÑ ÐºÐ½Ð¸Ð³.
{% if book_list %}
<!-- здеÑÑ Ð½Ð°Ñ ÐºÐ¾Ð´ "бежиÑ" по ÑпиÑÐºÑ ÐºÐ½Ð¸Ð³ -->
{% else %}
<p>РбиблиоÑеке книг неÑ.</p>
{% endif %}
Рданном ÑÑагменÑе пÑовеÑÑеÑÑÑ ÑолÑко одно ÑÑловие, но Ð²Ñ Ð¼Ð¾Ð¶ÐµÑе пÑоÑеÑÑиÑоваÑÑ Ð´ÑÑгие ваÑианÑÑ Ð¿Ñи помоÑи ÑÑга Ñаблона elif (напÑимеÑ, {% elif var2 %} ). ÐÐ»Ñ Ð´Ð¾Ð¿Ð¾Ð»Ð½Ð¸ÑелÑной инÑоÑмаÑии по данной Ñеме ÑмоÑÑиÑе: if, ifequal/ifnotequal и ifchanged в главе ÐÑÑÑоеннÑе ÑÑги и ÑилÑÑÑÑ Ñаблона (Django Docs).
Цикл For
Шаблон иÑполÑзÑÐµÑ ÑÑги for и endfor Ð´Ð»Ñ Ñого, ÑÑÐ¾Ð±Ñ "пÑобежаÑÑÑÑ" по ÑпиÑÐºÑ ÐºÐ½Ð¸Ð³, как показано ниже. Ðа каждой иÑеÑаÑии (каждом Ñикле) в пеÑеменнÑÑ Ñаблона book пеÑедаÑÑÑÑ Ð¸Ð½ÑоÑмаÑÐ¸Ñ ÑекÑÑего ÑлеменÑа ÑпиÑка.
{% for book in book_list %}
<li><!-- здеÑÑ ÐºÐ¾Ð´, коÑоÑÑй иÑполÑзÑÐµÑ Ð¸Ð½ÑоÑмаÑÐ¸Ñ Ð¸Ð· каждого ÑлеменÑа book ÑпиÑка--></li>
{% endfor %}
ÐÑ Ð½Ðµ пÑименÑем здеÑÑ, но внÑÑÑи каждого Ñикла Django ÑоздаÑÑ Ð¿ÐµÑеменнÑе, коÑоÑÑе Ð²Ñ Ð¼Ð¾Ð¶ÐµÑе иÑполÑзоваÑÑ Ð¿Ñи иÑеÑаÑии. ÐапÑимеÑ, Ð²Ñ Ð¼Ð¾Ð¶ÐµÑе пÑовеÑÑÑÑ Ð¿ÐµÑеменнÑÑ forloop.last (ÑказÑÐ²Ð°ÐµÑ Ð½Ð° поÑледнÑÑ Ð¸ÑеÑаÑÐ¸Ñ Ð² Ñикле) Ð´Ð»Ñ Ð²ÑÐ¿Ð¾Ð»Ð½ÐµÐ½Ð¸Ñ ÐºÐ°ÐºÐ¸Ñ
-либо завеÑÑаÑÑиÑ
дейÑÑвий Ð´Ð»Ñ Ð´Ð°Ð½Ð½Ð¾Ð³Ð¾ Ñикла.
ÐоÑÑÑп к пеÑеменнÑм
Ðод внÑÑÑи Ñикла ÑоздаÑÑ ÑкземплÑÑ Ð´Ð»Ñ ÐºÐ°Ð¶Ð´Ð¾Ð¹ книги из ÑпиÑка, пÑи помоÑи коÑоÑой показÑваеÑÑÑ Ð·Ð°Ð³Ð¾Ð»Ð¾Ð²Ð¾Ðº (как ÑÑÑлка на "ÑкоÑо-бÑдеÑ-Ñделано" подÑобное оÑобÑажение) и авÑоÑа книги.
<a href="{{ book.get_absolute_url }}">{{ book.title }}</a> ({{book.author}})
ÐÑ Ð¿Ð¾Ð»ÑÑаем доÑÑÑп к полÑм ÑооÑвеÑÑÑвÑÑÑей запиÑи о книге пÑи помоÑи "доÑ-ноÑаÑии", Ñо еÑÑÑ ÑеÑез ÑоÑÐºÑ (напÑимеÑ, book.title и book.author), где ÑекÑÑ, коÑоÑÑй идÑÑ Ð¿Ð¾Ñле book, ÑвлÑеÑÑÑ Ð¸Ð¼ÐµÐ½ÐµÐ¼ Ð¿Ð¾Ð»Ñ (Ñак, как опÑеделено в модели).
ÐÑоме Ñого, внÑÑÑи наÑего Ñаблона, Ð¼Ñ Ð¼Ð¾Ð¶ÐµÐ¼ вÑзÑваÑÑ ÑÑнкÑии модели â в данном ÑлÑÑае, Ð¼Ñ Ð²ÑзÑваем Book.get_absolute_url() Ð´Ð»Ñ Ð¿Ð¾Ð»ÑÑÐµÐ½Ð¸Ñ URL-адÑеÑа, коÑоÑÑй Ð¼Ñ Ð¸ÑполÑзÑем Ð´Ð»Ñ Ð¿Ð¾ÐºÐ°Ð·Ð° деÑалÑной инÑоÑмаÑии о книге. ÐаннÑй вÑзов ÑабоÑÐ°ÐµÑ ÑолÑко Ð´Ð»Ñ ÑÑнкÑии Ñ ÐºÐ¾ÑоÑой Ð½ÐµÑ Ð°ÑгÑменÑов (в Ñаблоне не ÑÑÑеÑÑвÑÐµÑ Ð²Ð¾Ð·Ð¼Ð¾Ð¶Ð½Ð¾ÑÑи пеÑедаÑÑ Ð°ÑгÑменÑÑ Ð² ÑÑнкÑиÑ!)
ÐÑимеÑание: ÐÑ Ð´Ð¾Ð»Ð¶Ð½Ñ Ð±ÑÑÑ Ð´Ð¾ÑÑаÑоÑно оÑмоÑÑиÑелÑнÑми Ð´Ð»Ñ Ñого, ÑÑÐ¾Ð±Ñ Ð¸Ð·Ð±ÐµÐ³Ð°ÑÑ "ÑÑоÑÐ¾Ð½Ð½Ð¸Ñ ÑÑÑекÑов" когда Ð¼Ñ Ð²ÑзÑваем ÑÑнкÑии из Ñаблона. Рданном ÑлÑÑае Ð¼Ñ Ð¿ÑоÑÑо полÑÑаем URL-адÑеÑ, но ÑÑнкÑии могÑÑ Ð´ÐµÐ»Ð°ÑÑ Ð²ÑÑ ÑÑо Ñгодно â Ð¼Ñ Ð½Ðµ Ñ Ð¾Ñели Ð±Ñ "ÑбиÑÑ" наÑа Ð±Ð°Ð·Ñ Ð´Ð°Ð½Ð½ÑÑ (напÑимеÑ) пÑоÑÑо оÑÑендеÑÐ¸Ð²Ð°Ñ Ð½Ð°Ñ Ñаблон!
Ðбновление базового Ñаблона
ÐÑкÑойÑе Ñайл базового Ñаблона (/locallibrary/catalog/templates/base_generic.html) и вÑÑавÑÑе {% url 'books' %} в URL-ÑÑÑÐ»ÐºÑ Ð´Ð»Ñ Ð¿ÑнкÑа All books, как показано ниже. Тем ÑамÑм, Ð¼Ñ Ñоздали "пеÑÐµÑ Ð¾Ð´" на ÑÑÑаниÑÑ Ñ ÐºÐ½Ð¸Ð³Ð°Ð¼Ð¸ (ÑепеÑÑ Ð¼Ñ Ð¼Ð¾Ð¶ÐµÐ¼ Ñмело ÑÑо ÑделаÑÑ, поÑколÑÐºÑ Ñ Ð½Ð°Ñ Ð¸Ð¼ÐµÐµÑÑÑ ÑооÑвеÑÑÑвÑÑÑее "книжное" url-пÑеобÑазование).
<li><a href="{% url 'index' %}">Home</a></li>
<li><a href="{% url 'books' %}">All books</a></li>
<li><a href="">All authors</a></li>
Ðак же ÑепеÑÑ Ð²Ñе ÑÑо вÑглÑдиÑ?
Ðока ÑÑо Ñ Ð²Ð°Ñ Ð½ÐµÑ Ð²Ð¾Ð·Ð¼Ð¾Ð¶Ð½Ð¾ÑÑи ÑоздаÑÑ ÑпиÑок книг, поÑÐ¾Ð¼Ñ ÑÑо Ð¼Ñ Ð½Ðµ ÑÑли еÑÑ Ð½ÐµÐ¾Ð±Ñ Ð¾Ð´Ð¸Ð¼Ñе завиÑимоÑÑи â пÑеобÑазование URL-адÑеÑа Ð´Ð»Ñ ÑÑÑÐ°Ð½Ð¸Ñ Ñ Ð¿Ð¾Ð´Ñобной инÑоÑмаÑии о книге, коÑоÑое Ð½ÐµÐ¾Ð±Ñ Ð¾Ð´Ð¸Ð¼Ð¾ Ð´Ð»Ñ ÑÑÑлок на оÑделÑнÑе книги. ÐÑ Ð¿Ð¾ÐºÐ°Ð¶ÐµÐ¼ ÑÑÑаниÑÑ Ñо ÑпиÑком и подÑобной инÑоÑмаÑией о книге поÑле ÑледÑÑÑего Ñаздела.
СÑÑаниÑа Ñ Ð¿Ð¾Ð´Ñобной инÑоÑмаÑией о книге
ÐоÑÑÑп к ÑÑÑаниÑе Ñ Ð¿Ð¾Ð´Ñобной инÑоÑмаÑией о книге оÑÑÑеÑÑвлÑеÑÑÑ Ð¿Ñи помоÑи URL-адÑеÑа catalog/book/<id> (где <id> ÑвлÑеÑÑÑ Ð¿ÐµÑвиÑнÑм клÑÑом Ð´Ð»Ñ Ð´Ð°Ð½Ð½Ð¾Ð¹ книги). Рдополнение к полÑм модели Book (авÑоÑ, кÑаÑкое ÑодеÑжание, ISBN, ÑзÑк и жанÑ), Ñакже Ð¼Ñ Ð¿ÐµÑеÑиÑлим деÑали доÑÑÑпнÑÑ
ÑкземплÑÑов книги (BookInstances) вклÑÑÐ°Ñ Ð¸Ñ
ÑÑаÑÑÑ, ожидаемÑÑ Ð´Ð°ÑÑ Ð²Ð¾Ð·Ð²ÑаÑа, ÑÑамп (imprint) и id. ÐÑо должно позволиÑÑ Ð½Ð°Ñим ÑиÑаÑелÑм не пÑоÑÑо ÑзнаÑÑ Ð¾ книге, но Ñакже ÑбедиÑÑÑÑ, имееÑÑÑ Ð»Ð¸ она в налиÑии и/или когда бÑÐ´ÐµÑ Ð´Ð¾ÑÑÑпна.
URL-пÑеобÑазованиÑ
ÐÑкÑойÑе /catalog/urls.py и добавÑÑе 'book-detail' URL-пÑеобÑазование, оÑмеÑенное жиÑнÑм в ÑледÑÑÑем ÑÑагменÑе. ÐÑа ÑÑнкÑÐ¸Ñ url() опÑеделÑÐµÑ Ð¿Ð°ÑÑеÑн, ÑвÑзаннÑй Ñ Ð¾Ð±Ð¾Ð±ÑÑннÑм клаÑÑом оÑобÑÐ°Ð¶ÐµÐ½Ð¸Ñ Ð´ÐµÑалÑной инÑоÑмаÑии, а Ñакже Ð¸Ð¼Ñ Ð´Ð»Ñ Ð´Ð°Ð½Ð½Ð¾Ð¹ ÑвÑзи.
from django.urls import path
from . import views
from django.conf.urls import url
urlpatterns = [
url(r'^$', views.index, name='index'),
url(r'^books/$', views.BookListView.as_view(), name='books'),
url(r'^book/(?P<pk>\d+)$', views.BookDetailView.as_view(), name='book-detail'),
]
РоÑлиÑие Ð¾Ñ Ð¿ÑедÑдÑÑиÑ
пÑеобÑазований, в данном ÑлÑÑае Ð¼Ñ Ð¿ÑименÑем наÑе ÑегÑлÑÑное вÑÑажение (Ð Ð) Ð´Ð»Ñ ÑопоÑÑÐ°Ð²Ð»ÐµÐ½Ð¸Ñ "наÑÑоÑÑего паÑÑеÑна", а не пÑоÑÑо ÑÑÑоки. Ðанное Ð Ð ÑопоÑÑавлÑÐµÑ Ð»Ñбой URL-адÑеÑ, коÑоÑÑй наÑинаеÑÑÑ Ñ book/, за коÑоÑÑм до конÑа ÑÑÑоки (до маÑкеÑа конÑа ÑÑÑоки - $) ÑледÑÑÑ Ð¾Ð´Ð½Ð°, или более ÑиÑÑ. РпÑоÑеÑÑе вÑÐ¿Ð¾Ð»Ð½ÐµÐ½Ð¸Ñ Ð´Ð°Ð½Ð½Ð¾Ð³Ð¾ пÑеобÑазованиÑ, оно "заÑ
ваÑÑваеÑ" ÑиÑÑÑ Ð¸ пеÑедаÑÑ Ð¸Ñ
в ÑÑнкÑÐ¸Ñ Ð¾ÑобÑÐ°Ð¶ÐµÐ½Ð¸Ñ ÐºÐ°Ðº паÑамеÑÑ Ñ Ð¸Ð¼ÐµÐ½ÐµÐ¼ pk.
ÐÑимеÑание:
Ðак бÑло оÑмеÑено Ñанее, Ð½Ð°Ñ Ð¿ÑеобÑазÑемÑй URL-адÑÐµÑ Ð² ÑеалÑноÑÑи вÑглÑÐ´Ð¸Ñ Ð²Ð¾Ñ Ñак catalog/book/<digits> (поÑÐ¾Ð¼Ñ ÑÑо Ð¼Ñ Ð½Ð°Ñ
одимÑÑ Ð² пÑиложении catalog, Ñо подÑазÑмеваеÑÑÑ ÐºÐ°Ñалог /catalog/).
ÐÑедÑпÑеждение:
ÐбобÑÑннÑй клаÑÑ Ð¾ÑобÑÐ°Ð¶ÐµÐ½Ð¸Ñ Ð¿Ð¾Ð´Ñобной инÑоÑмаÑии Ð¾Ð¶Ð¸Ð´Ð°ÐµÑ Ð¿Ð¾Ð»ÑÑиÑÑ Ð¿Ð°ÑамеÑÑ Ñ Ð¸Ð¼ÐµÐ½ÐµÐ¼ pk. ÐÑли Ð²Ñ Ð¿Ð¸ÑеÑе ÑÐ²Ð¾Ñ ÑобÑÑвеннÑÑ ÑÑнкÑÐ¸Ñ Ð¾ÑобÑажениÑ, Ñо Ñогда Ð²Ñ Ð¼Ð¾Ð¶ÐµÑе иÑполÑзоваÑÑ Ð¿Ð°ÑамеÑÑ Ñ Ð»ÑбÑм именем, коÑоÑÑй пожелаеÑе, или вообÑе пеÑедаваÑÑ Ð¸Ð½ÑоÑмаÑÐ¸Ñ Ð² безÑмÑнном аÑгÑменÑе.
ÐÑделÑнÑй пÑÐ¸Ð¼ÐµÑ Ñ ÑегÑлÑÑнÑми вÑÑажениÑми
ÐаÑÑеÑÐ½Ñ ÑегÑлÑÑного вÑÑÐ°Ð¶ÐµÐ½Ð¸Ñ ÑвлÑеÑÑÑ Ð½ÐµÐ²ÐµÑоÑÑно моÑнÑм инÑÑÑÑменÑом пÑеобÑазованиÑ. Ðока ÑÑо, Ð¼Ñ Ð½Ðµ оÑÐµÐ½Ñ Ð¼Ð½Ð¾Ð³Ð¾ говоÑили о Ð½Ð¸Ñ , поÑколÑÐºÑ Ð¼Ñ ÑопоÑÑавлÑли URL-адÑеÑа Ñ Ð¿ÑоÑÑÑми ÑÑÑоками (а не паÑÑеÑнами), и поÑÐ¾Ð¼Ñ ÑÑо они не инÑÑиÑÐ¸Ð²Ð½Ñ Ð¸ пÑгаÑÑий Ð´Ð»Ñ Ð½Ð°ÑинаÑÑÐ¸Ñ .
ÐÑимеÑание: Ðез паники! ÐÑ Ð±Ñдем ÑаÑÑмаÑÑиваÑÑ Ð¸ иÑполÑзоваÑÑ Ð´Ð¾ÑÑаÑоÑно пÑоÑÑÑе паÑÑеÑÐ½Ñ Ð¸ пÑи ÑÑом Ñ Ð¾ÑоÑо задокÑменÑиÑованнÑе!
РпеÑвÑÑ Ð¾ÑеÑÐµÐ´Ñ Ð²Ñ Ð´Ð¾Ð»Ð¶Ð½Ñ Ð·Ð½Ð°ÑÑ ÑÑо обÑÑно ÑегÑлÑÑнÑе вÑÑÐ°Ð¶ÐµÐ½Ð¸Ñ Ð¾Ð±ÑÑвлÑÑÑÑÑ Ð¿Ñи помоÑи ÑÑÑокового лиÑеÑала (Ñо еÑÑÑ, они заклÑÑÐµÐ½Ñ Ð² кавÑÑки: r'<ваÑе ÑегÑлÑÑное вÑÑажение>').
ÐлавнÑми ÑлеменÑами ÑинÑакÑиÑа обÑÑÐ²Ð»ÐµÐ½Ð¸Ñ Ð¿Ð°ÑÑеÑна, коÑоÑÑй Ð²Ñ Ð´Ð¾Ð»Ð¶Ð½Ñ Ð·Ð½Ð°ÑÑ, ÑвлÑÑÑÑÑ:
| Символ | ÐнаÑение |
|---|---|
| ^ | СооÑвеÑÑÑвÑÐµÑ Ð½Ð°ÑÐ°Ð»Ñ ÑÑÑоки |
| $ | СооÑвеÑÑÑвÑÐµÑ ÐºÐ¾Ð½ÑÑ ÑÑÑоки |
| \d | СооÑвеÑÑÑвÑÐµÑ ÑиÑÑе (0, 1, 2, ... 9) |
| \w | СооÑвеÑÑÑвÑÐµÑ Ð»ÑÐ±Ð¾Ð¼Ñ ÑÐ¸Ð¼Ð²Ð¾Ð»Ñ Ð¸Ð· алÑавиÑа в веÑÑ Ð½ÐµÐ¼- или нижнем- ÑегиÑÑÑе, ÑиÑÑе, или ÑÐ¸Ð¼Ð²Ð¾Ð»Ñ Ð¿Ð¾Ð´ÑÑÑÐºÐ¸Ð²Ð°Ð½Ð¸Ñ (_) |
| + | СооÑвеÑÑÑвÑÐµÑ Ð¾Ð´Ð½Ð¾Ð¼Ñ, или более пÑедÑдÑÑÐµÐ¼Ñ ÑимволÑ. ÐапÑимеÑ, Ð´Ð»Ñ ÑооÑвеÑÑÑÐ²Ð¸Ñ Ð¾Ð´Ð½Ð¾Ð¹, или более ÑиÑÑе Ð²Ñ Ð´Ð¾Ð»Ð¶Ð½Ñ Ð¸ÑполÑзоваÑÑ \d+. ÐÐ»Ñ Ð¾Ð´Ð½Ð¾Ð³Ð¾ и более Ñимвола "a", Ð²Ñ Ð¼Ð¾Ð¶ÐµÑе иÑполÑзоваÑÑ a+ |
| * | СооÑвеÑÑÑвÑÐµÑ Ð¾ÑÑÑÑÑÑÐ²Ð¸Ñ Ð²Ð¾Ð¾Ð±Ñе, или пÑиÑÑÑÑÑÐ²Ð¸Ñ Ð¾Ð´Ð½Ð¾Ð³Ð¾, или более пÑедÑдÑÑÐµÐ¼Ñ ÑимволÑ. ÐапÑимеÑ, Ð´Ð»Ñ ÑооÑвеÑÑÑÐ²Ð¸Ñ "ниÑемÑ", или ÑÐ»Ð¾Ð²Ñ (Ñо еÑÑÑ, лÑÐ±Ð¾Ð¼Ñ ÑимволÑ) Ð²Ñ Ð¼Ð¾Ð¶ÐµÑе иÑполÑзоваÑÑ \w* |
| ( ) | ÐÐ°Ñ Ð²Ð°Ñ ÑаÑÑи паÑÑеÑна внÑÑÑи Ñкобок. ÐÑбое Ð·Ð°Ñ Ð²Ð°Ñенное знаÑение бÑÐ´ÐµÑ Ð¿ÐµÑедано оÑобÑÐ°Ð¶ÐµÐ½Ð¸Ñ ÐºÐ°Ðº безÑмÑннÑй паÑамеÑÑ (еÑли Ð·Ð°Ñ Ð²Ð°ÑÑваеÑÑÑ Ð¼Ð½Ð¾Ð¶ÐµÑÑво паÑÑеÑнов, Ñо ÑооÑвеÑÑÑвÑÑÑие паÑамеÑÑÑ Ð±ÑдÑÑ Ð¿Ð¾ÑÑавлÑÑÑÑÑ Ð² поÑÑдке Ð¸Ñ Ð¾Ð±ÑÑвлениÑ). |
| (?P<name>...) | ÐÐ°Ñ Ð²Ð°Ñ ÑаÑÑи паÑÑеÑна (обознаÑенного ÑеÑез ...) как именованной пеÑеменной (в данном ÑлÑÑае <name>). ÐÐ°Ñ Ð²Ð°ÑеннÑе знаÑÐµÐ½Ð¸Ñ Ð¿ÐµÑедаÑÑÑÑ Ð² оÑобÑажение Ñ Ð¾Ð¿ÑеделÑннÑм именем. Таким обÑазом, ваÑе оÑобÑажение должно обÑÑвиÑÑ Ð°ÑгÑÐ¼ÐµÐ½Ñ Ñ Ñем же ÑамÑм именем! |
| [ ] | СооÑвеÑÑÑвÑÐµÑ Ð¾Ð´Ð½Ð¾Ð¼Ñ ÑÐ¸Ð¼Ð²Ð¾Ð»Ñ Ð¸Ð· множеÑÑва. ÐапÑимеÑ, [abc] бÑÐ´ÐµÑ ÑооÑвеÑÑÑвоваÑÑ Ð»Ð¸Ð±Ð¾ 'a', или 'b', или 'c'. [-\w] бÑÐ´ÐµÑ ÑооÑвеÑÑÑвоваÑÑ Ð»Ð¸Ð±Ð¾ ÑÐ¸Ð¼Ð²Ð¾Ð»Ñ '-' , или лÑÐ±Ð¾Ð¼Ñ Ð´ÑÑÐ³Ð¾Ð¼Ñ ÑловаÑÐ½Ð¾Ð¼Ñ ÑимволÑ. |
ÐолÑÑинÑÑво дÑÑÐ³Ð¸Ñ Ñимволов могÑÑ Ð±ÑÑÑ Ð·Ð°Ð´Ð°Ð½Ñ Ð±ÑквалÑно!
ÐавайÑе ÑаÑÑмоÑÑим неÑколÑко ÑеалÑнÑÑ Ð¿ÑимеÑов паÑÑеÑнов:
| ÐаÑÑеÑн | ÐпиÑание |
|---|---|
| r'^book/(?P<pk>\d+)$' | ÐÑо РРпÑименÑеÑÑÑ Ð² наÑем url-пÑеобÑазовании. Ðно ÑооÑвеÑÑÑвÑÐµÑ ÑÑÑоке, коÑоÑÐ°Ñ Ð½Ð°ÑинаеÑÑÑ Ñ book/ (^book/), заÑем Ð¸Ð¼ÐµÐµÑ Ð¾Ð´Ð½Ñ, или более ÑиÑÑ (\d+), а заÑем завеÑÑаеÑÑÑ (ÑиÑÑой и ÑолÑко ÑиÑÑой).Ðно Ñакже заÑ
ваÑÑÐ²Ð°ÐµÑ Ð²Ñе ÑиÑÑÑ (?P<pk>\d+) и пеÑедаÑÑ Ð¸Ñ
в оÑобÑажение, в паÑамеÑÑе Ñ Ð¸Ð¼ÐµÐ½ÐµÐ¼ 'pk'. **ÐаÑ
ваÑеннÑе знаÑÐµÐ½Ð¸Ñ Ð²Ñегда пеÑедаÑÑÑÑ ÐºÐ°Ðº ÑÑÑока!**ÐапÑимеÑ, Ð´Ð°Ð½Ð½Ð¾Ð¼Ñ Ð¿Ð°ÑÑеÑÐ½Ñ Ð´Ð¾Ð»Ð¶Ð½Ð° ÑооÑвеÑÑÑвоваÑÑ ÑледÑÑÑÐ°Ñ ÑÑÑока book/1234 , коÑоÑÐ°Ñ Ð¾ÑпÑавлÑÐµÑ Ð¿ÐµÑеменнÑÑ pk='1234' в оÑобÑажение. |
| r'^book/(\d+)$' | ÐÑÐ¾Ñ Ð¿Ð°ÑÑеÑн ÑооÑвеÑÑÑвÑÐµÑ Ñем же ÑамÑм URL-адÑеÑам как и в пÑедÑдÑÑем ÑлÑÑае. ÐÐ°Ñ Ð²Ð°ÑÐµÐ½Ð½Ð°Ñ Ð¸Ð½ÑоÑмаÑÐ¸Ñ Ð±ÑÐ´ÐµÑ Ð¾ÑпÑавлена в оÑобÑажение как безÑмÑннÑй паÑамеÑÑ. |
| r'^book/(?P<stub>[-\w]+)$' | ÐаннÑй паÑÑеÑн ÑооÑвеÑÑÑвÑÐµÑ ÑÑÑоке, коÑоÑÐ°Ñ Ð½Ð°ÑинаеÑÑÑ Ñ book/ (^book/), заÑем идÑÑ Ð¾Ð´Ð¸Ð½, или более Ñимволов либо '-', или ÑловаÑнÑе ÑÐ¸Ð¼Ð²Ð¾Ð»Ñ ([-\w]+), а заÑем завеÑÑаеÑÑÑ. Ðн Ñакже заÑ
ваÑÑÐ²Ð°ÐµÑ Ð´Ð°Ð½Ð½Ð¾Ðµ множеÑÑво Ñимволов и пеÑедаÑÑ Ð¸Ñ
в оÑобÑажение в паÑамеÑÑе Ñ Ð¸Ð¼ÐµÐ½ÐµÐ¼ 'stub'.ÐÑо доволÑно ÑипиÑнÑй паÑÑеÑн Ð´Ð»Ñ "ÑÑаба". СÑÐ°Ð±Ñ ÑвлÑÑÑÑÑ Ð´ÑÑжеÑÑвеннÑми URL-адÑеÑами - пеÑвиÑнÑми клÑÑами Ð´Ð»Ñ Ð´Ð°Ð½Ð½ÑÑ
. ÐÑ Ð¼Ð¾Ð³Ð»Ð¸ Ð±Ñ Ð¿ÑимениÑÑ ÑÑаб, еÑли Ð²Ñ Ð·Ð°Ñ
оÑели бÑ, ÑÑÐ¾Ð±Ñ URL-адÑÐµÑ Ð²Ð°Ñей книги бÑл более инÑоÑмаÑивнÑм. ÐапÑимеÑ, /catalog/book/the-secret-garden, вÑглÑÐ´Ð¸Ñ Ð½ÐµÐ¼Ð½Ð¾Ð³Ð¾ лÑÑÑе Ñем /catalog/book/33. |
ÐÑ Ð¼Ð¾Ð¶ÐµÑе Ð·Ð°Ñ Ð²Ð°ÑиÑÑ (ÑказаÑÑ) неÑколÑко паÑÑеÑнов в одном пÑеобÑазовании и, Ñем ÑамÑм, закодиÑоваÑÑ Ð¼Ð½Ð¾Ð³Ð¾ ÑазлиÑной инÑоÑмаÑии в URL-адÑеÑе.
ÐÑимеÑание: РкаÑеÑÑве дополниÑелÑного заданиÑ, ÑаÑÑмоÑÑиÑе возможноÑÑÑ Ñого, как Ð²Ñ Ð¼Ð¾Ð³Ð»Ð¸ Ð±Ñ Ð·Ð°ÐºÐ¾Ð´Ð¸ÑоваÑÑ url на ÑпиÑок вÑÐµÑ ÐºÐ½Ð¸Ð³, вÑÑедÑÐ¸Ñ Ð² опÑеделÑннÑй год, меÑÑÑ, Ð´ÐµÐ½Ñ Ð¸ какое Ð Ð (паÑÑеÑн) должно ÑооÑвеÑÑÑвоваÑÑ ÑÑомÑ.
ÐеÑедаÑа дополниÑелÑнÑÑ Ð½Ð°ÑÑÑоек в ваÑи пÑеобÑÐ°Ð·Ð¾Ð²Ð°Ð½Ð¸Ñ URL-адÑеÑов
Ðдной возможноÑÑÑÑ, коÑоÑÑÑ Ð¼Ñ Ð½Ðµ пÑименÑли здеÑÑ, но коÑоÑÐ°Ñ Ð¼Ð¾Ð³Ð»Ð° Ð±Ñ Ð±ÑÑÑ Ð²Ð°Ð¼ полезной, ÑвлÑеÑÑÑ Ñо, ÑÑо Ð²Ñ Ð¼Ð¾Ð¶ÐµÑе обÑÑвлÑÑÑ Ð¸ пеÑедаваÑÑ Ð´Ð¾Ð¿Ð¾Ð»Ð½Ð¸ÑелÑнÑе наÑÑÑойки в оÑобÑажениÑ. ÐаннÑе наÑÑÑойки обÑÑвлÑÑÑÑÑ ÐºÐ°Ðº ÑловаÑÑ, коÑоÑÑй Ð²Ñ Ð¿ÐµÑедаÑÑе как ÑÑеÑий безÑмÑннÑй аÑгÑÐ¼ÐµÐ½Ñ ÑÑнкÑии url(). ÐÑÐ¾Ñ ÑпоÑоб Ð¼Ð¾Ð¶ÐµÑ Ð±ÑÑÑ Ð¿Ð¾Ð»ÐµÐ·ÐµÐ½, еÑли Ð²Ñ Ñ
оÑиÑе воÑполÑзоваÑÑÑÑ Ñем же ÑамÑм оÑобÑажением Ð´Ð»Ñ Ð½ÐµÑколÑкиÑ
ÑеÑÑÑÑов и пеÑедаваÑÑ Ð´Ð°Ð½Ð½Ñе Ð´Ð»Ñ Ð¸Ð·Ð¼ÐµÐ½ÐµÐ½Ð¸Ñ ÐµÐ³Ð¾ Ð¿Ð¾Ð²ÐµÐ´ÐµÐ½Ð¸Ñ Ð² каждом оÑделÑном ÑлÑÑае (ниже, Ð¼Ñ Ð¿ÐµÑедаÑм ÑазнÑе имена Ñаблонов).
url(r'^/url/$', views.my_reused_view, {'my_template_name': 'some_path'}, name='aurl'),
url(r'^/anotherurl/$', views.my_reused_view, {'my_template_name': 'another_path'}, name='anotherurl'),
ÐÑимеÑание: РдополниÑелÑнÑе наÑÑÑойки, и именованнÑе Ð·Ð°Ñ Ð²Ð°ÑеннÑе паÑÑеÑÐ½Ñ Ð¿ÐµÑедаÑÑÑÑ Ð² оÑобÑажение как именованнÑе паÑамеÑÑÑ. ÐÑли Ð²Ñ Ð¸ÑполÑзÑеÑе одинаковое Ð¸Ð¼Ñ Ð¸ Ð´Ð»Ñ Ð·Ð°Ñ Ð²Ð°Ñенного паÑÑеÑна и Ð´Ð»Ñ Ð´Ð¾Ð¿Ð¾Ð»Ð½Ð¸ÑелÑной наÑÑÑойки, Ñо поÑледнÑÑ Ð±ÑÐ´ÐµÑ Ð¾ÑбÑоÑена, а в оÑобÑажение бÑÐ´ÐµÑ Ð¿ÐµÑедано знаÑение Ð·Ð°Ñ Ð²Ð°Ñенного паÑÑеÑна.
ÐÑобÑажение (на оÑнове клаÑÑа)
ÐÑкÑойÑе catalog/views.py, и ÑкопиÑÑйÑе ÑледÑÑÑий код в нижнÑÑ ÑаÑÑÑ Ñайла:
class BookDetailView(generic.DetailView):
model = Book
ÐÑо вÑÑ! ÐÑе ÑÑо вам надо ÑепеÑÑ ÑделаÑÑ ÑÑо ÑоздаÑÑ Ñаблон Ñ Ð¸Ð¼ÐµÐ½ÐµÐ¼ /locallibrary/catalog/templates/catalog/book_detail.html, а оÑобÑажение пеÑедаÑÑ ÐµÐ¼Ñ Ð¸Ð½ÑоÑмаÑÐ¸Ñ Ð¸Ð· Ð±Ð°Ð·Ñ Ð´Ð°Ð½Ð½ÑÑ
Ð´Ð»Ñ Ð¾Ð¿ÑеделÑнной запиÑи Book, вÑделенной пÑи помоÑи URL-пÑеобÑазованиÑ. ÐнÑÑÑи Ñаблона Ð²Ñ Ð¼Ð¾Ð¶ÐµÑе полÑÑиÑÑ Ð´Ð¾ÑÑÑп к ÑпиÑÐºÑ ÐºÐ½Ð¸Ð³ пÑи помоÑи пеÑеменной Ñ Ð¸Ð¼ÐµÐ½ÐµÐ¼ object или book (обобÑÑнно "the_model_name").
ÐÑли Ñ Ð²Ð°Ñ Ð¸Ð¼ÐµÐµÑÑÑ Ð½ÐµÐ¾Ð±Ñ Ð¾Ð´Ð¸Ð¼Ð¾ÑÑÑ, Ñо Ð²Ñ Ð¼Ð¾Ð¶ÐµÑе измениÑÑ ÑекÑÑий Ñаблон и/или Ð¸Ð¼Ñ Ð¾Ð±ÑекÑа конÑекÑÑа, иÑполÑзÑемого Ð´Ð»Ñ ÑÑÑлки на ÐºÐ½Ð¸Ð³Ñ Ð² Ñаблоне. ÐÑоме Ñого, Ð²Ñ Ð¼Ð¾Ð¶ÐµÑе пеÑеопÑеделиÑÑ Ð¼ÐµÑодÑ, напÑимеÑ, Ð´Ð»Ñ Ð´Ð¾Ð±Ð°Ð²Ð»ÐµÐ½Ð¸Ñ Ð´Ð¾Ð¿Ð¾Ð»Ð½Ð¸ÑелÑной инÑоÑмаÑии к конÑекÑÑÑ.
ЧÑо пÑоизойдÑÑ, еÑли запиÑи не ÑÑÑеÑÑвÑеÑ?
ÐÑли запÑаÑиваемой запиÑи не ÑÑÑеÑÑвÑеÑ, Ñогда обобÑÑннÑй клаÑÑ Ð¾ÑобÑÐ°Ð¶ÐµÐ½Ð¸Ñ Ð¿Ð¾Ð´Ñобной инÑоÑмаÑии авÑомаÑиÑеÑки "вÑкинеÑ" иÑклÑÑение Http404 â в пÑодакÑене ÑÑо пÑиведÑÑ Ðº авÑомаÑиÑеÑÐºÐ¾Ð¼Ñ Ð¾ÑобÑÐ°Ð¶ÐµÐ½Ð¸Ñ ÑÑÑаниÑÑ Ñ ÑекÑÑом "resource not found" ("ÑеÑÑÑÑ Ð½Ðµ найден"), коÑоÑÑÑ, конеÑно же, Ð²Ñ Ð¼Ð¾Ð¶ÐµÑе наÑÑÑоиÑÑ Ð¿Ð¾ ÑÐ²Ð¾ÐµÐ¼Ñ ÑÑмоÑÑениÑ.
ÐÑоÑÑо Ð´Ð»Ñ Ð¸Ð»Ð»ÑÑÑÑаÑии идеи как ÑÑо могло Ð±Ñ ÑабоÑаÑÑ, Ð¼Ñ Ð¿ÑиведÑм ÑÑÐ°Ð³Ð¼ÐµÐ½Ñ ÐºÐ¾Ð´Ð°, демонÑÑÑиÑÑÑÑего возможнÑÑ ÑеализаÑÐ¸Ñ Ð¾ÑобÑÐ°Ð¶ÐµÐ½Ð¸Ñ Ð² виде ÑÑнкÑии, еÑли по каким-либо пÑиÑинам Ð²Ñ Ð½Ðµ иÑполÑзÑеÑе оÑобÑажение на оÑнове обобÑÑнного клаÑÑа.
def book_detail_view(request,pk):
try:
book_id=Book.objects.get(pk=pk)
except Book.DoesNotExist:
raise Http404("Book does not exist")
#book_id=get_object_or_404(Book, pk=pk)
return render(
request,
'catalog/book_detail.html',
context={'book':book_id,}
)
РпеÑвÑÑ Ð¾ÑеÑÐµÐ´Ñ Ð¾ÑобÑажение пÑÑаеÑÑÑ Ð¿Ð¾Ð»ÑÑиÑÑ Ð¾Ð¿ÑеделÑннÑÑ Ð·Ð°Ð¿Ð¸ÑÑ Ð¾ книге из модели. ÐÑли ей ÑÑо не ÑдаÑÑÑÑ, Ñо "вÑбÑаÑÑваеÑÑÑ" иÑклÑÑение Http404, коÑоÑое ÑигнализиÑÑеÑ, ÑÑо Ð´Ð°Ð½Ð½Ð°Ñ ÐºÐ½Ð¸Ð³Ð° не найдена "not found". ÐоÑледним Ñагом ÑвлÑеÑÑÑ, как обÑÑно, вÑзов ÑÑнкÑии render() Ñ Ð¸Ð¼ÐµÐ½ÐµÐ¼ ÑооÑвеÑÑÑвÑÑÑего Ñаблона и даннÑÑ
о книге, пеÑедаваемÑÑ
в паÑамеÑÑе Ñ Ð¸Ð¼ÐµÐ½ÐµÐ¼ context (в виде ÑловаÑÑ).
ÐÑимеÑание:
ФÑнкÑÐ¸Ñ get_object_or_404() (показана закомменÑиÑованной) ÑвлÑеÑÑÑ ÑдобнÑм "ÑÑлÑком" Ð´Ð»Ñ Ð³ÐµÐ½ÐµÑаÑии иÑклÑÑÐµÐ½Ð¸Ñ Http404 еÑли запиÑÑ Ð½Ðµ найдена.
Создание Ñаблона деÑалÑной инÑоÑмаÑии
СоздайÑе HTML Ñайл /locallibrary/catalog/templates/catalog/book_detail.html и ÑкопиÑÑйÑе в него ÑодеÑжимое, пÑедÑÑавленное ниже. Ðак бÑло Ñказано Ñанее, ÑÑо Ñаблон "по ÑмолÑаниÑ" (Ð¸Ð¼Ñ Ñаблона), коÑоÑÑй "ожидаеÑÑÑ"обобÑÑннÑм клаÑÑом оÑобÑÐ°Ð¶ÐµÐ½Ð¸Ñ Ð´ÐµÑалÑной инÑоÑмаÑии (Ð´Ð»Ñ Ð¼Ð¾Ð´ÐµÐ»Ð¸ Ñ Ð¸Ð¼ÐµÐ½ÐµÐ¼ Book в пÑиложении Ñ Ð¸Ð¼ÐµÐ½ÐµÐ¼ catalog).
{% extends "base_generic.html" %}
{% block content %}
<h1>Title: {{ book.title }}</h1>
<p><strong>Author:</strong> <a href="">{{ book.author }}</a></p> <!-- author detail link not yet defined -->
<p><strong>Summary:</strong> {{ book.summary }}</p>
<p><strong>ISBN:</strong> {{ book.isbn }}</p>
<p><strong>Language:</strong> {{ book.language }}</p>
<p><strong>Genre:</strong> {% for genre in book.genre.all %} {{ genre }}{% if not forloop.last %}, {% endif %}{% endfor %}</p>
<div style="margin-left:20px;margin-top:20px">
<h4>Copies</h4>
{% for copy in book.bookinstance_set.all %}
<hr>
<p class="{% if copy.status == 'a' %}text-success{% elif copy.status == 'd' %}text-danger{% else %}text-warning{% endif %}">{{ copy.get_status_display }}</p>
{% if copy.status != 'a' %}<p><strong>Due to be returned:</strong> {{copy.due_back}}</p>{% endif %}
<p><strong>Imprint:</strong> {{copy.imprint}}</p>
<p class="text-muted"><strong>Id:</strong> {{copy.id}}</p>
{% endfor %}
</div>
{% endblock %}
ÐÑимеÑание: СÑÑлка на авÑоÑа в Ñаблоне ÑодеÑÐ¶Ð¸Ñ Ð¿ÑÑÑой URL-адÑеÑ, поÑÐ¾Ð¼Ñ ÑÑо Ð¼Ñ ÐµÑÑ Ð½Ðµ Ñоздали ÑÑÑаниÑÑ Ð´ÐµÑалÑной инÑоÑмаÑии об авÑоÑе. Ðогда ÑÑо пÑоизойдÑÑ, Ð²Ñ Ð´Ð¾Ð»Ð¶Ð½Ñ Ð±ÑдеÑе обновиÑÑ Ð´Ð°Ð½Ð½Ñй URL-адÑÐµÑ ÐºÐ°Ðº Ñказано ниже:
<a href="{% url 'author-detail' book.author.pk %}">{{ book.author }}</a>
ХоÑÑ Ð¸ неÑколÑко болÑÑе, но поÑÑи вÑе в данном Ñаблоне нам Ñже вÑÑÑеÑалоÑÑ Ñанее:
- ÐÑ ÑаÑÑиÑÑем Ð½Ð°Ñ Ð±Ð°Ð·Ð¾Ð²Ñй Ñаблон и пеÑеопÑеделÑем блок
content. - ÐÑ Ð¸ÑполÑзÑем ÑÑловие
ifÐ´Ð»Ñ Ð¿Ð¾ÐºÐ°Ð·Ð° Ñого, или иного ÑодеÑжимого. - ÐÑ Ð¸ÑполÑзÑем ÑиклÑ
forÑого, ÑÑÐ¾Ð±Ñ Ð¿ÑобежаÑÑÑÑ Ð¿Ð¾ ÑлеменÑам (обÑекÑам) в ÑооÑвеÑÑÑвÑÑÑÐ¸Ñ ÑпиÑÐºÐ°Ñ . - ÐÑ Ð¿Ð¾Ð»ÑÑаем доÑÑÑп к полÑм конÑекÑÑа пÑи помоÑи "доÑ-ноÑаÑии" (поÑколÑÐºÑ Ð¼Ñ Ð¸ÑполÑзовали обобÑÑннÑй клаÑÑ Ð¾ÑобÑÐ°Ð¶ÐµÐ½Ð¸Ñ Ð´ÐµÑалÑной инÑоÑмаÑии, Ñо конÑекÑÑ Ð¸Ð¼ÐµÐµÑ Ð¸Ð¼Ñ
book; Ñакже можем иÑполÑзоваÑÑ Ð¸Ð¼Ñobject)
Ðдной инÑеÑеÑной веÑÑÑ, коÑоÑÑÑ Ð¼Ñ Ð½Ðµ видели Ñанее, ÑвлÑеÑÑÑ ÑÑнкÑÐ¸Ñ book.bookinstance_set.all(). ÐаннÑй меÑод ÑвлÑеÑÑÑ "авÑомагиÑеÑки"-ÑконÑÑÑÑиÑованнÑм Django Ð´Ð»Ñ Ñого, ÑÑÐ¾Ð±Ñ Ð²ÐµÑнÑÑÑ Ð¼Ð½Ð¾Ð¶ÐµÑÑво запиÑей BookInstance, ÑвÑзаннÑÑ
Ñ Ð´Ð°Ð½Ð½Ð¾Ð¹ книгой Book.
{% for copy in book.bookinstance_set.all %}
<!-- иÑеÑаÑии по каждой копии/ÑкземплÑÑÑ ÐºÐ½Ð¸Ð³Ð¸ -->
{% endfor %}
ÐÑÐ¾Ñ Ð¼ÐµÑод Ñоздан, поÑÐ¾Ð¼Ñ ÑÑо вÑ, на ÑÑоÑоне "многим" данной ÑвÑзи, обÑÑвили поле ForeignKey (один-ко многим). ÐоÑколÑÐºÑ Ð²Ñ Ð½Ð¸Ñего не обÑÑвили на дÑÑгой ÑÑоÑоне ("один") данной модели (Ñо еÑÑÑ, Ð¼Ð¾Ð´ÐµÐ»Ñ Book "ниÑего не знаеÑ" пÑо Ð¼Ð¾Ð´ÐµÐ»Ñ BookInstance), Ñо она не Ð¸Ð¼ÐµÐµÑ Ð½Ð¸ÐºÐ°ÐºÐ¾Ð¹ возможноÑÑи (по ÑмолÑаниÑ) Ð´Ð»Ñ Ð¿Ð¾Ð»ÑÑÐµÐ½Ð¸Ñ Ð¼Ð½Ð¾Ð¶ÐµÑÑва ÑооÑвеÑÑÑвÑÑÑиÑ
запиÑей. ÐÐ»Ñ Ñого, ÑÑÐ¾Ð±Ñ Ð¾Ð±Ð¾Ð¹Ñи ÑÑÑ Ð¿ÑоблемÑ, Django конÑÑÑÑиÑÑÐµÑ ÑооÑвеÑÑÑвÑÑÑÑÑ ÑÑнкÑÐ¸Ñ "обÑаÑного пÑоÑмоÑÑа" ("reverse lookup"), коÑоÑой Ð²Ñ Ð¼Ð¾Ð¶ÐµÑе воÑполÑзоваÑÑÑÑ. ÐÐ¼Ñ Ð´Ð°Ð½Ð½Ð¾Ð¹ ÑÑнкÑии ÑоздаÑÑÑÑ Ð² нижнем ÑегиÑÑÑе и ÑоÑÑÐ¾Ð¸Ñ Ð¸Ð· имени модели, в коÑоÑой бÑл обÑÑвлен ForeignKey (Ñо еÑÑÑ, bookinstance), за коÑоÑÑм ÑледÑÐµÑ _set (Ñо еÑÑÑ ÑÑнкÑиÑ, ÑÐ¾Ð·Ð´Ð°Ð½Ð½Ð°Ñ Ð´Ð»Ñ Book бÑÐ´ÐµÑ Ð¸Ð¼ÐµÑÑ Ð²Ð¸Ð´ bookinstance_set()).
ÐÑимеÑание:
ÐдеÑÑ Ð¼Ñ Ð¸ÑполÑзÑем all() Ð´Ð»Ñ Ð¿Ð¾Ð»ÑÑÐµÐ½Ð¸Ñ Ð²ÑеÑ
запиÑей (по ÑмолÑаниÑ). ÐÑ, навеÑное, могли Ð±Ñ Ð¸ÑполÑзоваÑÑ Ð¼ÐµÑод filter() Ð´Ð»Ñ Ð¿Ð¾Ð»ÑÑÐµÐ½Ð¸Ñ Ð¿Ð¾Ð´Ð¼Ð½Ð¾Ð¶ÐµÑÑва запиÑей в коде, но, к ÑожалениÑ, Ð²Ñ ÐРможеÑе пÑимениÑÑ Ð´Ð°Ð½Ð½Ñй вÑзов в Ñаблоне, поÑÐ¾Ð¼Ñ ÑÑо Ð²Ñ Ð½Ðµ можеÑе пеÑедаÑÑ Ð² нем (в Ñаблоне) аÑгÑменÑÑ Ð² ÑÑнкÑиÑ.
ÐбÑаÑиÑе внимание, ÑÑо еÑли Ð²Ñ Ð½Ðµ опÑеделÑеÑе поÑÑдок вÑдаÑи даннÑÑ (в ваÑем оÑобÑажении, или в модели), Ñо ÑеÑÐ²ÐµÑ ÑазÑабоÑки "вÑкинеÑ" ÑообÑÐµÐ½Ð¸Ñ Ð¾Ð± оÑÐ¸Ð±ÐºÐ°Ñ , Ð¿Ð¾Ñ Ð¾Ð¶Ð¸Ðµ на ÑледÑÑÑие:
[29/May/2017 18:37:53] "GET /catalog/books/?page=1 HTTP/1.1" 200 1637 /foo/local_library/venv/lib/python3.5/site-packages/django/views/generic/list.py:99: UnorderedObjectListWarning: Pagination may yield inconsistent results with an unordered object_list: <QuerySet [<Author: Ortiz, David>, <Author: H. McRaven, William>, <Author: Leigh, Melinda>]> allow_empty_first_page=allow_empty_first_page, **kwargs)
ÐÑо ÑлÑÑилоÑÑ Ð¿Ð¾ÑÐ¾Ð¼Ñ ÑÑо, paginator object (далее обÑÐµÐºÑ Ð¿Ð¾ÑÑÑаниÑного вÑвода) Ð¾Ð¶Ð¸Ð´Ð°ÐµÑ Ð²Ð¸Ð´ÐµÑÑ Ð½ÐµÐºÑÑ ÑпоÑÑдоÑенноÑÑÑ ORDER BY пÑи запÑоÑе к базе даннÑÑ . Ðез ÑÑого, он не ÑÐ¼Ð¾Ð¶ÐµÑ Ð³Ð°ÑанÑиÑоваÑÑ Ð¿ÑавилÑнÑй вÑвод полÑÑеннÑÑ Ð´Ð°Ð½Ð½ÑÑ !
Ðанное ÑÑководÑÑво пока не доÑло до опиÑÐ°Ð½Ð¸Ñ Pagination (пока, но ÑкоÑо бÑдеÑ), и поÑколÑÐºÑ Ð²Ñ Ð½Ðµ можеÑе иÑполÑзоваÑÑ ÑÑнкÑÐ¸Ñ sort_by() и пеÑедаваÑÑ Ð¿Ð°ÑамеÑÑ (по Ñой же пÑиÑине, ÑÑо и filter()) Ð²Ñ Ð´Ð¾Ð»Ð¶Ð½Ñ Ð²ÑбÑаÑÑ Ð¾Ð´Ð¸Ð½ из ÑÑÑÑ
ваÑианÑов далÑнейÑиÑ
дейÑÑвий:
- ÐобавиÑÑ Ð°ÑÑибÑÑ
orderingвнÑÑÑиMeta-клаÑÑаобÑÑвленного в ваÑей модели. - ÐобавиÑÑ Ð°ÑÑибÑÑ
querysetв ваÑей ÑеализаÑии клаÑÑа оÑобÑажениÑ, опÑеделÑÑÑегоorder_by(). - ÐобавиÑÑ Ð¼ÐµÑод
get_querysetв ваÑÑ ÑеализаÑÐ¸Ñ ÐºÐ»Ð°ÑÑа оÑобÑÐ°Ð¶ÐµÐ½Ð¸Ñ Ð¸ Ñакже опÑеделиÑÑ Ð¼ÐµÑодorder_by().
ÐÑли Ð²Ñ Ð²ÑбÑали пÑÐ½ÐºÑ Ð½Ð¾Ð¼ÐµÑ Ð¾Ð´Ð¸Ð½ Ñ Meta-клаÑÑом Ð´Ð»Ñ Ð¼Ð¾Ð´ÐµÐ»Ð¸ Author (веÑоÑÑно, не Ñакой гибкий как ваÑÐ¸Ð°Ð½Ñ Ñ Ð½Ð°ÑÑÑойкой клаÑÑа оÑобÑажениÑ, но Ñем не менее, доÑÑаÑоÑно пÑоÑÑой), Ð²Ñ Ð´Ð¾Ð»Ð¶Ð½Ñ Ð¿ÑийÑи к ÑемÑ-Ñо поÑ
Ð¾Ð¶ÐµÐ¼Ñ Ð½Ð° ÑледÑÑÑее:
class Author(models.Model):
first_name = models.CharField(max_length=100)
last_name = models.CharField(max_length=100)
date_of_birth = models.DateField(null=True, blank=True)
date_of_death = models.DateField('Died', null=True, blank=True)
def get_absolute_url(self):
return reverse('author-detail', args=[str(self.id)])
def __str__(self):
return '%s, %s' % (self.last_name, self.first_name)
class Meta:
ordering = ['last_name']
ÐонеÑно же, поле не обÑзаÑелÑно должно имеÑÑ Ð¸Ð¼Ñ last_name: оно Ð¼Ð¾Ð¶ÐµÑ Ð±ÑÑÑ Ð»ÑбÑм.
РпоÑледнее, но не оконÑаÑелÑное, Ð²Ñ Ð´Ð¾Ð»Ð¶Ð½Ñ ÑоÑÑиÑоваÑÑ Ð¿Ð¾ аÑÑибÑÑÑ/колонке, коÑоÑÐ°Ñ Ð±Ñла пÑоиндекÑиÑована (ÑникалÑно, или неÑ) в ваÑей базе даннÑÑ Ð´Ð»Ñ Ñого, ÑÑÐ¾Ð±Ñ Ð¸Ð·Ð±ÐµÐ¶Ð°ÑÑ Ð¿Ñоблем Ñ Ð±ÑÑÑÑодейÑÑвием. ÐонеÑно, ÑÑо не ÑвлÑеÑÑÑ Ð½ÐµÐ¾Ð±Ñ Ð¾Ð´Ð¸Ð¼Ñм в данном пÑимеÑе (и мÑ, веÑоÑÑно, забегаем далеко впеÑÑд), еÑли Ñ Ð½Ð°Ñ Ñакое неболÑÑое колиÑеÑÑво книг (и полÑзоваÑелей!), но ÑÑо Ð½ÐµÐ¾Ð±Ñ Ð¾Ð´Ð¸Ð¼Ð¾ помниÑÑ Ð´Ð»Ñ Ð±ÑдÑÑÐ¸Ñ Ð¿ÑоекÑов.
Ðак ÑÑо ÑепеÑÑ Ð²ÑглÑдиÑ?
Ðа даннÑй Ð¼Ð¾Ð¼ÐµÐ½Ñ Ð¼Ñ Ð´Ð¾Ð»Ð¶Ð½Ñ Ð±Ñли ÑоздаÑÑ Ð²Ñе необÑ
одимое Ð´Ð»Ñ Ð¿Ð¾ÐºÐ°Ð·Ð° ÑÑÑÐ°Ð½Ð¸Ñ Ñо ÑпиÑком книг и деÑалÑной инÑоÑмаÑией. ÐапÑÑÑиÑе ÑеÑÐ²ÐµÑ (python3 manage.py runserver) и оÑкÑойÑе Ð²Ð°Ñ Ð±ÑаÑÐ·ÐµÑ http://127.0.0.1:8000/.
ÐÑедÑпÑеждение: Ðе кликайÑе на каком-либо авÑоÑе, - ÑÑÑлки пока не Ð·Ð°Ð´Ð°Ð½Ñ â ÑÑо бÑÐ´ÐµÑ Ð²Ð°Ñим дополниÑелÑнÑм заданием!
ÐликниÑе ÑÑÑÐ»ÐºÑ All books Ð´Ð»Ñ Ð¿ÐµÑÐµÑ Ð¾Ð´Ð° на ÑÑÑаниÑÑ Ñо ÑпиÑком книг.

ÐаÑем кликниÑе на ÑÑÑÐ»ÐºÑ Ð¾Ð´Ð½Ð¾Ð¹ из ваÑÐ¸Ñ ÐºÐ½Ð¸Ð³. ÐÑли вÑе наÑÑÑоено как надо, Ñо Ð²Ñ Ð´Ð¾Ð»Ð¶Ð½Ñ ÑвидеÑÑ Ñо, ÑÑо Ñказано на каÑÑинке.

ÐоÑÑÑаниÑнÑй вÑвод (Pagination)
ÐÑли Ñ Ð²Ð°Ñ Ð²Ñего лиÑÑ Ð½ÐµÑколÑко запиÑей в базе даннÑÑ , Ñо наÑа ÑÑÑаниÑа вÑвода ÑпиÑка книг бÑÐ´ÐµÑ Ð²ÑглÑдеÑÑ Ð¾ÑлиÑно. Тем не менее, когда Ñ Ð²Ð°Ñ Ð¿Ð¾ÑвÑÑÑÑ Ð´ÐµÑÑÑки, или ÑоÑни запиÑей ваÑа ÑÑÑаниÑа ÑÑÐ°Ð½ÐµÑ Ð·Ð½Ð°ÑиÑелÑно долÑÑе загÑÑжаÑÑÑÑ (и ÑÑÐ°Ð½ÐµÑ ÑлиÑком длинной Ð´Ð»Ñ ÐºÐ¾Ð¼ÑоÑÑного пÑоÑмоÑÑа). РеÑением данной пÑÐ¾Ð±Ð»ÐµÐ¼Ñ ÑвлÑеÑÑÑ Ð´Ð¾Ð±Ð°Ð²Ð»ÐµÐ½Ð¸Ðµ поÑÑÑаниÑного вÑвода (Pagination) к ваÑÐµÐ¼Ñ Ð¾ÑобÑÐ°Ð¶ÐµÐ½Ð¸Ñ ÑпиÑка, коÑоÑÑй бÑÐ´ÐµÑ Ð²ÑводиÑÑ Ð¾Ð³ÑаниÑенное колиÑеÑÑво ÑлеменÑов на каждой ÑÑÑаниÑе.
Django Ð¸Ð¼ÐµÐµÑ Ð¾ÑлиÑнÑй вÑÑÑоеннÑй Ð¼ÐµÑ Ð°Ð½Ð¸Ð·Ð¼ Ð´Ð»Ñ Ð¿Ð¾ÑÑÑаниÑного вÑвода. Ðаже более Ñого, он вÑÑÑоен в обобÑÑннÑй клаÑÑ Ð¾ÑобÑÐ°Ð¶ÐµÐ½Ð¸Ñ ÑпиÑков, ÑледоваÑелÑно вам не нÑжно пÑоделÑваÑÑ Ð±Ð¾Ð»ÑÑой обÑем ÑабоÑÑ, ÑÑÐ¾Ð±Ñ Ð²Ð¾ÑполÑзоваÑÑÑÑ Ð²Ð¾Ð·Ð¼Ð¾Ð¶Ð½Ð¾ÑÑÑми поÑÑÑаниÑного вÑвода!
ÐÑобÑажениÑ
ÐÑкÑойÑе catalog/views.py и добавÑÑе поле paginate_by как показано жиÑнÑм в ÑледÑÑÑем ÑÑагменÑе.
class BookListView(generic.ListView):
model = Book
paginate_by = 10
Ðак ÑолÑко Ñ Ð²Ð°Ñ Ð¿Ð¾ÑвиÑÑÑ Ð±Ð¾Ð»ÐµÐµ 10 запиÑей в базе даннÑÑ
оÑобÑажение наÑнÑÑ ÑоÑмиÑоваÑÑ Ð¿Ð¾ÑÑÑаниÑнÑй вÑвод даннÑÑ
, коÑоÑÑе он пеÑедаÑÑ ÑаблонÑ. Ð ÑазлиÑнÑм ÑÑÑаниÑам данного вÑвода можно полÑÑиÑÑ Ð´Ð¾ÑÑÑп пÑи помоÑи паÑамеÑÑов GET-запÑоÑа â к ÑÑÑаниÑе 2 Ð²Ñ Ð¼Ð¾Ð¶ÐµÑе полÑÑиÑÑ Ð´Ð¾ÑÑÑп, иÑполÑзÑÑ URL-адÑеÑ: /catalog/books/?page=2.
ШаблонÑ
ТепеÑÑ, когда даннÑе вÑводÑÑÑÑ Ð¿Ð¾ÑÑÑаниÑно, нам надо добавиÑÑ ÑÑнкÑионалÑноÑÑÑ Ð¿ÐµÑеклÑÑÐµÐ½Ð¸Ñ Ð¼ÐµÐ¶Ð´Ñ ÑÑÑаниÑами в Ñаблона ÑÑÑаниÑÑ. ÐоÑколÑÐºÑ Ð¼Ñ Ñ Ð¾Ñели Ð±Ñ Ð¸ÑполÑзоваÑÑ Ð´Ð°Ð½Ð½Ñй Ð¼ÐµÑ Ð°Ð½Ð¸Ð·Ð¼ Ð´Ð»Ñ Ð²ÑÐµÑ ÑпиÑков на ÑайÑе, Ñо Ð¼Ñ Ð¿ÑопиÑем его в базовом Ñаблоне ÑайÑа.
ÐÑкÑойÑе /locallibrary/catalog/templates/base_generic.html и, ниже блока content, вÑÑавÑÑе блок (во ÑÑагменÑе не вÑделен жиÑнÑм), оÑвеÑаÑÑий за поÑÑÑаниÑнÑй вÑвод. ÐаннÑй код, в пеÑвÑÑ Ð¾ÑеÑедÑ, пÑовеÑÑÐµÑ "вклÑÑÑн" ли меÑ
анизм поÑÑÑаниÑного вÑвода Ð´Ð»Ñ Ð´Ð°Ð½Ð½Ð¾Ð¹ ÑÑÑаниÑÑ Ð¸ еÑли ÑÑо Ñак, Ñо он добавлÑÐµÑ ÑÑÑлки next и previous, ÑооÑвеÑÑÑвенно (а Ñакже, Ð½Ð¾Ð¼ÐµÑ ÑекÑÑей ÑÑÑаниÑÑ).
{% block content %}{% endblock %}
{% block pagination %}
{% if is_paginated %}
<div class="pagination">
<span class="page-links">
{% if page_obj.has_previous %}
<a href="{{ request.path }}?page={{ page_obj.previous_page_number }}">previous</a>
{% endif %}
<span class="page-current">
Page {{ page_obj.number }} of {{ page_obj.paginator.num_pages }}.
</span>
{% if page_obj.has_next %}
<a href="{{ request.path }}?page={{ page_obj.next_page_number }}">next</a>
{% endif %}
</span>
</div>
{% endif %}
{% endblock %}
ÐаÑамеÑÑ page_obj ÑвлÑеÑÑÑ Ð¾Ð±ÑекÑом Ñипа Paginator, коÑоÑÑй бÑÐ´ÐµÑ ÑоздаваÑÑÑÑ ÐºÐ°Ð¶Ð´Ñй Ñаз, когда бÑÐ´ÐµÑ Ð¿ÑименÑÑÑÑÑ Ð¿Ð¾ÑÑÑаниÑнÑй вÑвод даннÑÑ
Ð´Ð»Ñ ÑекÑÑей ÑÑÑаниÑÑ. Ðн позволÑÐµÑ Ð¿Ð¾Ð»ÑÑиÑÑ Ð²ÑÑ Ð¸Ð½ÑоÑмаÑÐ¸Ñ Ð¾ ÑекÑÑей ÑÑÑаниÑе, о пÑедÑдÑÑиÑ
ÑÑÑаниÑаÑ
, ÑколÑко вÑего ÑÑÑÐ°Ð½Ð¸Ñ Ð¸ Ñак далее.
ÐÑ Ð¸ÑполÑзÑем {{ request.path }} Ð´Ð»Ñ Ð¿Ð¾Ð»ÑÑÐµÐ½Ð¸Ñ URL-адÑеÑа ÑекÑÑей ÑÑÑаниÑÑ, Ð´Ð»Ñ Ñого, ÑÑÐ¾Ð±Ñ ÑоздаÑÑ ÑÑÑлки на ÑооÑвеÑÑÑвÑÑÑие ÑÑÑаниÑÑ, обÑаÑиÑе внимание, ÑÑо даннÑй вÑзов не завиÑÐ¸Ñ Ð¾Ñ Ð¾Ð±ÑекÑа page_obj и, Ñаким обÑазом, Ð¼Ð¾Ð¶ÐµÑ Ð¸ÑполÑзоваÑÑÑÑ Ð¾ÑделÑно.
Ðа ÑÑом вÑе!
Ðак ÑÑо вÑглÑдиÑ?
ÐаÑÑинка ниже показÑÐ²Ð°ÐµÑ ÐºÐ°Ðº вÑглÑÐ´Ð¸Ñ Ð¿Ð¾ÑÑÑаниÑнÑй вÑвод â еÑли Ð²Ñ Ð½Ðµ добавили более 10 запиÑей в ваÑÑ Ð±Ð°Ð·Ñ Ð´Ð°Ð½Ð½ÑÑ
, Ñогда Ð²Ñ Ð¼Ð¾Ð¶ÐµÑе пÑовеÑиÑÑ ÐºÐ°Ðº ÑÑо ÑабоÑаеÑ, пÑоÑÑо ÑменÑÑив знаÑение в paginate_by, в Ñайле catalog/views.py. ÐÐ»Ñ Ð¿Ð¾Ð»ÑÑÐµÐ½Ð¸Ñ ÑезÑлÑÑаÑа, ÑооÑвеÑÑÑвÑÑÑего каÑÑинке ниже, Ð¼Ñ Ð¸Ð·Ð¼ÐµÐ½Ð¸Ð»Ð¸ paginate_by = 2.
СÑÑлки на ÑÑÑаниÑÑ Ð¿Ð¾ÐºÐ°Ð·Ð°Ð½Ñ Ð² нижней ÑаÑÑи ÑÑÑаниÑÑ. ÐÐ¾ÐºÐ°Ð·Ð°Ð½Ñ ÑÑÑлки ÑледÑÑÑаÑ/пÑедÑдÑÑÐ°Ñ Ð² завиÑимоÑÑи Ð¾Ñ Ñого на какой ÑÑÑаниÑе Ð²Ñ Ð² даннÑй Ð¼Ð¾Ð¼ÐµÐ½Ñ Ð½Ð°Ñ Ð¾Ð´Ð¸ÑеÑÑ.

ÐÑовеÑÑÑе ÑебÑ
ÐополниÑелÑнÑм задание в данной ÑÑаÑÑе и Ð´Ð»Ñ Ð·Ð°Ð²ÐµÑÑÐµÐ½Ð¸Ñ Ð´Ð°Ð½Ð½Ð¾Ð³Ð¾ ÑÑапа пÑоекÑа бÑÐ´ÐµÑ Ñоздание оÑобÑажений деÑалÑной инÑоÑмаÑии об авÑоÑе и Ð¸Ñ ÑпиÑка. ÐÑи оÑобÑÐ°Ð¶ÐµÐ½Ð¸Ñ Ð´Ð¾Ð»Ð¶Ð½Ñ Ð½Ð°Ñ Ð¾Ð´Ð¸ÑÑÑÑ Ð¿Ð¾ ÑледÑÑÑим адÑеÑам:
catalog/authors/â СпиÑок авÑоÑов.catalog/author/<id>â ÐеÑалÑÐ½Ð°Ñ Ð¸Ð½ÑоÑмаÑÐ¸Ñ Ð¾Ð± авÑоÑе Ñо знаÑением пеÑвиÑного клÑÑа ÑавнÑм<id>
СооÑвеÑÑÑвÑÑÑий код Ð´Ð»Ñ URL-пÑеобÑазований и оÑобÑажений должен бÑÑÑ Ð¸Ð´ÐµÐ½ÑиÑнÑм ÐºÐ¾Ð´Ñ Ð´Ð»Ñ ÑпиÑка книг и деÑалÑной инÑоÑмаÑии о книге Book, коÑоÑÑй Ð¼Ñ Ñоздали Ñанее. Ð¨Ð°Ð±Ð»Ð¾Ð½Ñ Ð±ÑдÑÑ Ð¾ÑлиÑаÑÑÑÑ, но бÑдÑÑ Ð¸Ð¼ÐµÑÑ Ð¿Ð¾Ñ
ожее поведение.
ÐÑимеÑание:
-
Ðогда Ð²Ñ ÑоздадиÑе URL-пÑеобÑазование Ð´Ð»Ñ ÑÑÑаниÑÑ ÑпиÑка авÑоÑов вам понадобиÑÑÑ Ð¾Ð±Ð½Ð¾Ð²Ð¸ÑÑ ÑÑÑÐ»ÐºÑ All authors в базовом Ñаблоне. СледÑйÑе Ñем же пÑÑÑм, коÑоÑÑй Ð¼Ñ Ð¿Ñоделали когда обновлÑли ÑÑÑÐ»ÐºÑ All books.
-
Ðогда Ð²Ñ ÑоздадиÑе URL-пÑеобÑазование Ð´Ð»Ñ ÑÑÑаниÑÑ Ñ Ð´ÐµÑалÑной инÑоÑмаÑией об авÑоÑе, Ð²Ñ Ð´Ð¾Ð»Ð¶Ð½Ñ Ð±ÑдеÑе обновиÑÑ Ñаблон деÑалÑной инÑоÑмаÑии о книге (/locallibrary/catalog/templates/catalog/book_detail.html), Ñаким обÑазом, ÑÑÐ¾Ð±Ñ ÑÑÑлка авÑоÑа ÑказÑвала на ÑÑÑаниÑÑ Ñ Ð´ÐµÑалÑной инÑоÑмаÑии о нем (а не бÑÑÑ Ð¿ÑÑÑой). ÐÐ°Ð½Ð½Ð°Ñ ÑÑÑлка бÑÐ´ÐµÑ Ð¸Ð¼ÐµÑÑ Ð²Ð¸Ð´ как Ñказано жиÑнÑм во ÑÑагменÑе ниже.
django<p> <strong>Author:</strong> <a href="{% url 'author-detail' book.author.pk %}">{{ book.author }}</a> </p>
Ðогда Ð²Ñ Ð·Ð°ÐºÐ¾Ð½ÑиÑе, ваÑи ÑÑÑаниÑÑ Ð´Ð¾Ð»Ð¶Ð½Ñ Ð±ÑдÑÑ Ð²ÑглÑдеÑÑ ÐºÐ°Ðº на каÑÑинке.


ÐÑоги
ÐоздÑавлÑем! ÐаÑа Ð±Ð°Ð·Ð¾Ð²Ð°Ñ ÑÑнкÑионалÑноÑÑÑ Ð±Ð¸Ð±Ð»Ð¸Ð¾Ñеки гоÑова!
Рданной ÑÑаÑÑе Ð¼Ñ Ð¸Ð·ÑÑили как пÑименÑÑÑ Ð¾Ð±Ð¾Ð±ÑÑннÑе клаÑÑÑ Ð¾ÑобÑÐ°Ð¶ÐµÐ½Ð¸Ñ ÑпиÑка и деÑалÑной инÑоÑмаÑии, и иÑполÑзоваÑÑ Ð¸Ñ Ð´Ð»Ñ ÑÐ¾Ð·Ð´Ð°Ð½Ð¸Ñ ÑÑÑÐ°Ð½Ð¸Ñ Ð¾ÑобÑÐ°Ð¶ÐµÐ½Ð¸Ñ Ð½Ð°ÑÐ¸Ñ ÐºÐ½Ð¸Ð³ и авÑоÑов. ÐÑоме Ñого, Ð¼Ñ Ð¼Ð½Ð¾Ð³Ð¾Ðµ Ñзнали о паÑÑеÑÐ½Ð°Ñ Ð¿ÑеобÑазованиÑ, поÑÑÑоеннÑÑ Ð½Ð° оÑнове ÑегÑлÑÑнÑÑ Ð²ÑÑажений, а Ñакже Ñо, как Ð²Ñ Ð¼Ð¾Ð¶ÐµÑе пеÑедаваÑÑ Ð´Ð°Ð½Ð½Ñе из URL-адÑеÑа в ваÑе оÑобÑажение. ÐÑ Ð¸Ð·ÑÑили неÑколÑко пÑиÑмов пÑÐ¸Ð¼ÐµÐ½ÐµÐ½Ð¸Ñ Ñаблонов. Ð Ñамом конÑе Ð¼Ñ Ð¿Ð¾ÐºÐ°Ð·Ð°Ð»Ð¸ как оÑÑÑеÑÑвлÑÑÑ Ð¿Ð¾ÑÑÑаниÑнÑй вÑвод ÑпиÑков, Ñак, ÑÑо наÑи ÑпиÑки ÑпÑавлÑÑÑÑÑ Ð´Ð°Ð¶Ðµ Ñогда, когда они ÑодеÑÐ¶Ð°Ñ Ð¼Ð½Ð¾Ð³Ð¾ запиÑей.
РнаÑей ÑледÑÑÑей ÑÑаÑÑе Ð¼Ñ ÑаÑÑиÑим наÑÑ Ð±Ð¸Ð±Ð»Ð¸Ð¾ÑекÑ, пÑÑÑм поддеÑжки полÑзоваÑелÑÑÐºÐ¸Ñ Ð°ÐºÐºÐ°ÑнÑов, и Ñак обÑазом пÑодемонÑÑÑиÑÑем аÑÑенÑиÑикаÑиÑ, ÑазгÑаниÑение ÑÑовней доÑÑÑпа, ÑеÑÑии и ÑоÑмÑ.
ÐополниÑелÑÐ½Ð°Ñ Ð¸Ð½ÑоÑмаÑиÑ
- ÐÑÑÑоеннÑе обобÑÑннÑе клаÑÑÑ Ð¾ÑобÑÐ°Ð¶ÐµÐ½Ð¸Ñ (Django docs)
- ÐбобÑÑннÑй вид оÑобÑÐ°Ð¶ÐµÐ½Ð¸Ñ (Django docs)
- Ðведение в оÑобÑÐ°Ð¶ÐµÐ½Ð¸Ñ Ð½Ð° оÑнове клаÑÑов (Django docs)
- ÐÑÑÑоеннÑе Ñеги Ñаблона и ÑилÑÑÑÑ (Django docs).
- ÐоÑÑÑаниÑнÑй вÑвод (Pagination) (Django docs)