Книга «Изучаем Python»



Pdf көрінісі
бет221/238
Дата07.01.2022
өлшемі7,86 Mb.
#18670
түріКнига
1   ...   217   218   219   220   221   222   223   224   ...   238
Байланысты:
2 5343781172763690906

ПРИМЕЧАНИЕ

В больших проектах часто создается один родительский шаблон base .html для всего сайта и ро-

дительские  шаблоны  для  каждого  крупного  раздела  сайта .  Все  шаблоны  разделов  наследуют 

от base .html, и каждая страница сайта наследует от шаблона раздела . При такой структуре вы смо-




Построение других страниц    401

жете легко изменять оформление и поведение сайта в целом, любого его раздела или  отдельной 

страницы . Данная конфигурация сильно повышает эффективность работы и стимулирует разработ-

чика к дальнейшему совершенствованию сайта .

Страница со списком тем

Разобравшись с тем, как эффективно организовать построение страниц, мы можем 

сосредоточиться на следующих двух страницах: списке всех тем и списке записей 

по одной теме. На странице тем выводится перечень всех тем, созданных пользо-

вателями, и это первая страница, на которой нам придется работать с данными.

Схема URL для тем

Сначала нужно определить URL для страницы тем. Обычно в таких случаях 

выбирается простой фрагмент URL, который отражает суть информации, пред-

ставленной на странице. Мы воспользуемся словом topics, так что для получения 

страницы будет использоваться URL http://localhost:8000/topics/. А вот какие из-

менения следует внести в 

learning_logs/urls .py

:

urls.py

"""Определяет схемы URL для learning_logs."""

...

urlpatterns = [



# Домашняя страница

url(r'^$', views.index, name='index'),

    # Вывод всех тем.

    url(r'^topics/$', views.topics, name='topics'),



]

Мы просто добавили 

topics/

 в аргумент регулярного выражения, используемый 

с URL-адресом домашней страницы . Когда Django проверяет запрашиваемый 

URL-адрес, эта схема совпадет с любым URL-адресом, который состоит из базо-

вого URL-адреса и слова 

topics


. Косую черту в конце можно включить, можно 

не включать, но после слова 

topics

 ничего быть не должно, иначе схема не совпа-



дет. Любой запрос с URL-адресом, соответствующим этой схеме, будет передан 

функции 


topics()

 в 


views .py

.

Представление topics



Функция 

topics()


 должна получать данные из базы данных и отправлять их ша-

блону. Обновленная версия 

views .py

 выглядит так:



views.py

from django.shortcuts import render

  from .models import Topic



def index(request):

...



402    Глава 18  •  Знакомство с Django

def topics(request):



    """Выводит список тем."""

    topics = Topic.objects.order_by('date_added')



    context = {'topics': topics}

    return render(request, 'learning_logs/topics.html', context)



Сначала импортируется модель, связанная с нужными данными . Функции 

topics()


 необходим один параметр: объект запроса, полученный Django от сер-

вера . В точке  выдается запрос к базе данных на получение объектов 

Topic



отсортированных по атрибуту 



date_added

. Полученный итоговый набор сохраня-

ется в 

topics


.

В точке  определяется контекст, который будет передаваться шаблону. Контекст 

представляет собой словарь, в котором ключами являются имена, используемые 

в шаблоне для обращения к данным, а значениями — данные, которые должны пере-

даваться шаблону. В данном случае существует всего одна пара «ключ—значение», 

которая содержит набор тем, отображаемых на странице. При построении стра-

ницы, использующей данные, функции 

render()


 передается переменная 

context


а также объект 

request

 и путь к шаблону .

Шаблон topics

Шаблон страницы со списком тем получает словарь 

context

, чтобы шаблон мог ис-

пользовать данные, предоставленные 

topics()


. Создайте файл с именем 

topics .html

 

в одном каталоге с 



index .html

. Вывод списка тем в шаблоне осуществляется следу-

ющим образом:

topics.html

{% extends "learning_logs/base.html" %}

{% block content %}

 
Topics


 



        {% for topic in topics %}

         

  • {{ topic }}


  •     {% empty %}

         

  • No topics have been added yet.
  •     {% endfor %}



     



{% endblock content %}

Сначала тег 

{%

 

extends



 

%}

 объявляет о наследовании от 



base .html

, как и в случае 

с шаблоном 

index


, после чего открывается блок 

content


. Тело страницы содержит 

маркированный (bulleted) список введенных тем. В стандартном языке HTML мар-

кированный список называется неупорядоченным списком и обозначается тегами 

    . Список тем начинается в точке .

    В точке  находится другой шаблонный тег, эквивалентный циклу 

    for


     для пере-

    бора списка тем из словаря 

    context

    . Код, используемый в шаблоне, отличает-

    ся от Python в нескольких важных отношениях. Python использует отступы 



    Построение других страниц    403

    для  обозначения строк, входящих в тело цикла. В шаблоне каждый цикл 

    for

     должен 


    снабжаться явным тегом 

    {%

     



    endfor

     

    %}



    , обозначающим конец цикла. Таким образом, 

    в шаблонах часто встречаются циклы следующего вида:

    {% for элемент in список %}

        действия для каждого элемента

    {% endfor %}

    В цикле каждая тема должна быть преобразована в элемент маркированного спи-

    ска. Чтобы вывести значение переменной в шаблоне, заключите ее имя в двойные 

    фигурные скобки. Код 

    {{

     



    topic

     

    }}



     в точке  будет заменен значением 

    topic


     при 

    каждом проходе цикла. Фигурные скобки на странице не появятся; они всего 

    лишь сообщают Django об использовании шаблонной переменной. Тег HTML 

  •  обозначает элемент списка. Все, что находится между тегами, в паре тегов 



      , будет отображаться как элемент маркированного списка.

      В точке  находится шаблонный тег 

      {%

       



      empty

       

      %}



      , который сообщает Django, что 

      делать при отсутствии элементов в списке. В нашем примере выводится сообще-

      ние о том, что темы еще не созданы. Последние две строки завершают цикл 

      for


        

      и маркированный список 

      .

      Затем необходимо изменить базовый шаблон и включить ссылку на страницу 



      с темами:

      base.html

        Learning Log -

        Topics
      {% block content %}{% endblock content %}



      После ссылки на домашнюю страницу  добавляется дефис, после которого встав-

      ляется ссылка на страницу тем, которая также представлена шаблонным тегом . 

      Эта строка приказывает Django сгенерировать ссылку, соответствующую схеме 

      URL с именем 

      'topics'

      , в 


      learning_logs/urls .py

      .

      Обновив домашнюю страницу в браузере, вы увидите ссылку 



      Topics

      . Щелчок 

      на этой ссылке открывает страницу, похожую на рис. 18.4.



      Достарыңызбен бөлісу:
      1   ...   217   218   219   220   221   222   223   224   ...   238




      ©emirsaba.org 2024
      әкімшілігінің қараңыз

          Басты бет