Руководство django часть 4: административная панель django

Пользовательские библиотеки тегов и фильтров¶

Некоторые приложения предоставляют настраиваемые библиотеки тегов и фильтров. Чтобы получить к ним доступ в шаблоне, убедитесь, что приложение находится в (в этом примере мы добавили бы ), а затем используйте тег в шаблоне:

{% load humanize %}

{{ 45000|intcomma }}

В приведенном выше примере тег загружает библиотеку тегов , которая затем делает фильтр доступным для использования. Если вы включили , вы можете проконсультироваться в области документации в вашей админке, чтобы найти список настраиваемых библиотек в вашей установке.

Тег может принимать несколько имен библиотек, разделенных пробелами. Пример:

{% load humanize i18n %}

Смотрите Пользовательские теги и фильтры шаблонов для получения информации о написании собственных библиотек пользовательских шаблонов.

Пользовательские библиотеки и наследование шаблонов

Когда вы загружаете собственный тег или библиотеку фильтров, теги/фильтры становятся доступными только для текущего шаблона, а не для родительских или дочерних шаблонов по пути наследования шаблона.

Например, если в шаблоне есть , дочерний шаблон (например, тот, который имеет ) не будет иметь доступ к тегам и фильтрам гуманизированного шаблона. Дочерний шаблон отвечает за свой собственный .

Это функция ради ремонтопригодности и здравомыслия.

См.также

Справочник шаблонов
Охватывает встроенные теги, встроенные фильтры, использование альтернативного языка шаблонов и многое другое.

Передача шаблонам параметров

Я много раз
произносил слово «шаблон», но что оно означает? Если посмотреть на файлы index.html или about.html, то это просто
текст, который загружается и отдается браузеру по соответствующему запросу. Все
так, но в этих же файлах можно прописать конструкции для отображения
информации, например, из БД. Давайте для начала сделаем так, чтобы на каждой
странице был свой заголовок, переданный ей через параметр title. Это можно
сделать так. В файлах index.html и about.html укажем переменную
title:

<!DOCTYPE html>
<html>
<head>
         <title>{{title}}</title>
</head>
<body>
<h1>{{title}}</h1>
</body>
</html>

А в функциях
представлений передать параметр title соответствующему
шаблону:

def index(request):
    return render(request, 'women/index.html', {'title': 'Главная страница'})
 
def about(request):
    return render(request, 'women/about.html', {'title': 'О сайте'})

Все, теперь
вместо title будет
подставлена строка «Главная страница» или «О сайте» и отображаться на
соответствующей странице. Удобно, правда? Вот в этом и есть роль шаблонов: они
описывают структуру страницы, а ее наполнение происходит динамически в самой
программе.

Можно выполнять
передачу и более сложных данных, например, списков. Предположим, главное меню
сайта определено через список:

menu = "О сайте", "Добавить статью", "Обратная связь", "Войти"

А, затем, в
функциях представления, мы можем передать его как параметр:

def index(request):
    return render(request, 'women/index.html', {'menu': menu, 'title': 'Главная страница'})
 
def about(request):
    return render(request, 'women/index.html', {'menu': menu, 'title': 'О сайте'})

Для отображения
этого списка в шаблонах, очевидно нужно перебрать в цикле его элементы и
сформировать отдельные пункты:

<ul>
{% for m in menu %}
<li>{{m}}</li>
{% endfor %}
</ul>

Все, если теперь
перейти на сайт и отобразить, например, главную страницу, то увидим этот список
в виде HTML-тегов.

Проверка объектов ¶

Проверка модели проходит в три этапа:

  1. Проверка полей модели —
  2. Проверить всю модель —
  3. Проверка уникальности полей —

Все три шага выполняются при вызове метода модели.

При использовании формы вызов выполняет эти шаги проверки для всех полей, включенных в форму. См. Документацию ModelForm для получения дополнительной информации. Вызов метода модели должен быть необходим только тогда, когда вы хотите справиться с ошибками проверки самостоятельно или если поля были исключены из и требуют проверки.

( exclude = None , validate_unique = True )

Этот метод вызывает , и (если это ), в указанном порядке , и могут генерировать исключение с атрибутом , содержащей ошибку , произведенной из трех методов.

Необязательный параметр можно использовать для предоставления списка имен полей, которые можно исключить из проверки и очистки. использует этот параметр, чтобы исключить из проверки поля, которые отсутствуют в форме, поскольку какие-либо ошибки не могут быть исправлены пользователем.

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

Например :

from django.core.exceptions import ValidationError
try
    article.full_clean()
except ValidationError as e
    # Do something based on the errors contained in e.message_dict.
    # Display them to a user, or handle them programmatically.
    pass

Первое, что вы делаете, — очищаете каждое поле индивидуально.

( exclude = None )

Этот метод проверяет все поля модели. Необязательный параметр можно использовать для предоставления списка имен полей, которые нужно исключить из проверки. Исключение создается для каждого поля, не прошедшего проверку.

Второе, что делает, — это звонок . Этот метод можно перегрузить для выполнения пользовательской проверки модели.

()

Именно этот метод следует использовать для обеспечения проверки пользовательской модели и, при необходимости, для изменения атрибутов модели. Например, мы могли бы воспользоваться этим методом, чтобы назначить автоматическое значение полю или выполнить проверку, которая требует доступа к другим полям модели:

import datetime
from django.core.exceptions import ValidationError
from django.db import models
from django.utils.translation import gettext_lazy as _

class Article(models.Model):
    ...
    def clean(self):
        # Don't allow draft entries to have a pub_date.
        if self.status == 'draft' and self.pub_date is not None
            raise ValidationError(_('Draft entries may not have a publication date.'))
        # Set the pub_date for published items if it hasn't been set already.
        if self.status == 'published' and self.pub_date is None
            self.pub_date = datetime.date.today()

Однако обратите внимание на то , что метод модели не вызывается во время вызова метода модели. В приведенном выше примере сгенерированное исключение было создано путем передачи строки, она будет сохранена в определенном ключе в словаре ошибок

Этот ключ зарезервирован для ошибок, связанных с моделью в целом, а не с конкретным полем:

В приведенном выше примере сгенерированное исключение было создано путем передачи строки, она будет сохранена в определенном ключе в словаре ошибок . Этот ключ зарезервирован для ошибок, связанных с моделью в целом, а не с конкретным полем:

from django.core.exceptions import NON_FIELD_ERRORS, ValidationError
try
    article.full_clean()
except ValidationError as e
    non_field_errors = e.message_dictNON_FIELD_ERRORS

Чтобы назначить исключение конкретному полю, создайте экземпляр со словарем, ключи которого соответствуют именам полей. Мы могли бы обновить предыдущий пример, назначив ошибку полю :

class Article(models.Model):
    ...
    def clean(self):
        # Don't allow draft entries to have a pub_date.
        if self.status == 'draft' and self.pub_date is not None
            raise ValidationError({'pub_date' _('Draft entries may not have a publication date.')})
        ...

Если вы обнаружите ошибки в нескольких полях во время , также можно передать словарь, совпадающий имена полей с ошибками:

raise ValidationError({
    'title' ValidationError(_('Missing title.'), code='required'),
    'pub_date' ValidationError(_('Invalid date.'), code='invalid'),
})

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

( exclude = None )

Этот метод похож на , но проверяет все ограничения уникальности модели вместо значений отдельных полей. Необязательный параметр можно использовать для предоставления списка имен полей, которые нужно исключить из проверки. Исключение создается для каждого поля, не прошедшего проверку.

Переменные ¶

Переменные выглядят следующим образом : . Когда механизм шаблонов встречает переменную, он оценивает эту переменную и заменяет ее результатом. Имена переменных состоят из любой комбинации буквенно-цифровых символов и символа подчеркивания ( ), но не могут начинаться с подчеркивания и не могут быть числом. Точка ( ) также появляется в разделах переменных, хотя это имеет особое значение, как указано ниже

Важно отметить, что в именах переменных не должно быть пробелов или знаков препинания

Используйте точку ( ) для доступа к атрибутам переменной.

За кулисами

Технически, когда система шаблонов встречает точку, она пытается выполнить следующие поиски в следующем порядке:

  • Поиск по словарю
  • Поиск атрибута или метода
  • Поиск по числовому индексу

Если результирующее значение можно вызвать, оно вызывается без аргументов. Результат вызова становится значением шаблона.

Этот порядок поиска может вызвать непредвиденное поведение с объектами, которые переопределяют поиск по словарю. Например, рассмотрим следующий фрагмент кода, который пытается перебрать :

{% for k, v in defaultdict.items %}
    Do something with k and v here...
{% endfor %}

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

В приведенном выше примере будет заменен
атрибутом объекта.

Если вы используете переменную, которой не существует, система шаблонов вставит значение параметра, для которого по умолчанию установлено значение (пустая строка).

Обратите внимание, что «bar» в выражении шаблона, например, будет интерпретироваться как буквальная строка и не будет использовать значение переменной «bar», если она существует в контексте шаблона

Документация Django

Django (Джанго) — свободный фреймворк для веб-приложений на языке Python, использующий шаблон проектирования MVC. Проект поддерживается организацией Django Software Foundation.

Сайт на Django строится из одного или нескольких приложений, которые рекомендуется делать отчуждаемыми и подключаемыми. Это одно из существенных архитектурных отличий этого фреймворка от некоторых других (например, Ruby on Rails). Один из основных принципов фреймворка — DRY (англ. Don’t repeat yourself).

Также, в отличие от других фреймворков, обработчики URL в Django конфигурируются явно при помощи регулярных выражений.

Для работы с базой данных Django использует собственный ORM, в котором модель данных описывается классами Python, и по ней генерируется схема базы данных.

Фильтры¶

Вы можете изменить значение переменной используя фильтры.

Фильтры выглядят таким образом: {{ name|lower }}. Это выведет значение переменной {{ name }} после применения фильтра к нему, который преобразует значение в нижний регистр. Используйте символ (|) для применения фильтра.

Можно использовать “цепочку” фильтров. Вывод одного фильтра используется для другого. {{ text|escape|linebreaks }} обычно применяется для экранирования текста, и замены переноса строки тегами <p>.

Некоторые фильтры принимают аргументы. Аргумент фильтра выглядит таким образом: {{ bio|truncatewords:30 }}. Этот код отобразит первые 30 слов переменной bio.

Аргументы фильтров, которые содержат пробелы, должны быть заключены в кавычки. Например, чтобы объединить список пробелом и запятой, используйте {{ list|join:", " }}.

Django предоставляет около шестидесяти встроенных фильтров. Вы можете прочитать о них в . Чтобы дать вам представление о возможностях, вот некоторые из наиболее часто используемых фильтров:

Если значение равно False или пустым, будет использовано значение по умолчанию. В противном случае используется значение. Например:

{{ value|default:"nothing" }}

Если value равно "" (пустая строка), будет выведено nothing.

Возвращает размер значения. Работает для строк и списков, например:

{{ value|length }}

Если value равно , выведет 4.

Форматирует размер файла в читабельный вид (например, '13 KB', '4.1 MB', '102 bytes', и т.д.). Например:

{{ value|filesizeformat }}

Если value равно 123456789, выведет 117.7 MB.

Опять же, это всего лишь несколько примеров; полный список смотрите .

Вы можете создать собственный фильтр; смотрите Собственные шаблонные теги и фильтры.

Фильтры¶

Вы можете изменять переменные для отображения с помощью фильтров.

Фильтры выглядят так: . Это отображает значение переменной после фильтрации с помощью фильтра , который преобразует текст в нижний регистр. Используйте вертикальную черту (), чтобы применить фильтр.

Фильтры можно «связать». Выходные данные одного фильтра применяются к следующему. — распространенная идиома для экранирования текстового содержимого с последующим преобразованием разрывов строк в теги .

Некоторые фильтры принимают аргументы. Аргумент фильтра выглядит так: . Это отобразит первые 30 слов переменной .

Аргументы фильтра, содержащие пробелы, должны быть заключены в кавычки; например, чтобы присоединиться к списку с запятыми и пробелами, вы должны использовать .

Django предоставляет около шестидесяти встроенных шаблонных фильтров. Вы можете прочитать все о них в . Чтобы дать вам представление о том, что доступно, вот некоторые из наиболее часто используемых шаблонных фильтров:

Если переменная ложна или пуста, используйте данное значение по умолчанию. В противном случае используйте значение переменной. Например:

{{ value|default:"nothing" }}

Если не указано или пусто, в приведенном выше сообщении будет отображаться значение «».

Возвращает длину значения. Это работает как для строк, так и для списков. Например:

{{ value|length }}

Если равно , на выходе будет .

Форматирует значение как «удобочитаемый» размер файла (например, , , и т.д.). Например:

{{ value|filesizeformat }}

Если равно 123456789, на выходе будет .

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

Вы также можете создавать свои собственные фильтры шаблонов; смотрите Пользовательские теги и фильтры шаблонов.

Отображение списка статей

Теперь, когда мы
в целом разобрались, что из себя представляют шаблоны, давайте выполним чтение
данных из таблицы women и отобразим список статей на главной
странице сайта. Для этого в модуле women/views.py выполним импорт
моделей:

from .models import *

А, затем, в
функции представления index прочитаем записи из таблицы Women и передадим
коллекцию шаблону:

def index(request):
    posts = Women.objects.all()
    return render(request, 'women/index.html', {'posts': posts, 'menu': menu, 'title': 'Главная страница'})

Видите, как
просто это делается! Нам даже не нужно беспокоиться о подключении к БД.
Фреймворк Django все эти
операции берет на себя. Все что нам нужно – это выбрать нужные записи из
таблицы и передать их в шаблон. В самом шаблоне index.html переберем эти
записи и отобразим в виде списка на странице:

{% extends 'women/base.html' %}
 
{% block content %}
<h1>{{title}}</h1>
<ul>
         {% for p in posts %}
         <li>
                   <h2>{{p.title}}</h2>
                   {{p.content}}</p>
                   <hr>
         </li>
         {% endfor %}
</ul>
{% endblock %}

Видео по теме

#1. Django — что это такое, порядок установки

#2. Модель MTV. Маршрутизация. Функции представления

#3. Маршрутизация, обработка исключений запросов, перенаправления

#4. Определение моделей. Миграции: создание и выполнение

#5. CRUD — основы ORM по работе с моделями

#6. Шаблоны (templates). Начало

#7. Подключение статических файлов. Фильтры шаблонов

#8. Формирование URL-адресов в шаблонах

#9. Создание связей между моделями через класс ForeignKey

#10. Начинаем работу с админ-панелью

#11. Пользовательские теги шаблонов

#12. Добавляем слаги (slug) к URL-адресам

#13. Использование форм, не связанных с моделями

#14. Формы, связанные с моделями. Пользовательские валидаторы

#15. Классы представлений: ListView, DetailView, CreateView

#16. Основы ORM Django за час

#17. Mixins — убираем дублирование кода

#18. Постраничная навигация (пагинация)

#19. Регистрация пользователей на сайте

#20. Делаем авторизацию пользователей на сайте

#21. Оптимизация сайта с Django Debug Toolbar

#22. Включаем кэширование данных

#23. Использование капчи captcha

#24. Тонкая настройка админ панели

#25. Начинаем развертывание Django-сайта на хостинге

#26. Завершаем развертывание Django-сайта на хостинге

Фильтры¶

Вы можете изменить значение переменной используя фильтры.

Фильтры выглядят таким образом: . Это выведет значение переменной после применения фильтра к нему, который преобразует значение в нижний регистр. Используйте символ () для применения фильтра.

Можно использовать “цепочку” фильтров. Вывод одного фильтра используется для другого. обычно применяется для экранирования текста, и замены переноса строки тегами .

Некоторые фильтры принимают аргументы. Аргумент фильтра выглядит таким образом: . Этот код отобразит первые 30 слов переменной .

Аргументы фильтров, которые содержат пробелы, должны быть заключены в кавычки. Например, чтобы объединить список пробелом и запятой, используйте .

Django предоставляет около шестидесяти встроенных фильтров. Вы можете прочитать о них в . Чтобы дать вам представление о возможностях, вот некоторые из наиболее часто используемых фильтров:

Если значение равно или пустым, будет использовано значение по умолчанию. В противном случае используется значение. Например:

{{ value|default:"nothing" }}

Если равно (пустая строка), будет выведено .

Возвращает размер значения. Работает для строк и списков, например:

{{ value|length }}

Если равно , выведет .

Форматирует размер файла в читабельный вид (например, , , , и т.д.). Например:

{{ value|filesizeformat }}

Если равно 123456789, выведет .

Опять же, это всего лишь несколько примеров; полный список смотрите .

Вы можете создать собственный фильтр; смотрите Собственные шаблонные теги и фильтры.

Фильтры¶

Вы можете изменять переменные для отображения с помощью фильтров.

Фильтры выглядят так: . Это отображает значение переменной после фильтрации с помощью фильтра , который преобразует текст в нижний регистр. Используйте вертикальную черту (), чтобы применить фильтр.

Фильтры можно «связать». Выходные данные одного фильтра применяются к следующему. — распространенная идиома для экранирования текстового содержимого с последующим преобразованием разрывов строк в теги .

Некоторые фильтры принимают аргументы. Аргумент фильтра выглядит так: . Это отобразит первые 30 слов переменной .

Аргументы фильтра, содержащие пробелы, должны быть заключены в кавычки; например, чтобы присоединиться к списку с запятыми и пробелами, вы должны использовать .

Django предоставляет около шестидесяти встроенных шаблонных фильтров. Вы можете прочитать все о них в . Чтобы дать вам представление о том, что доступно, вот некоторые из наиболее часто используемых шаблонных фильтров:

Если переменная ложна или пуста, используйте данное значение по умолчанию. В противном случае используйте значение переменной. Например:

{{ value|default:"nothing" }}

Если не указано или пусто, в приведенном выше сообщении будет отображаться значение «».

Возвращает длину значения. Это работает как для строк, так и для списков. Например:

{{ value|length }}

Если равно , на выходе будет .

Форматирует значение как «удобочитаемый» размер файла (например, , , и т.д.). Например:

{{ value|filesizeformat }}

Если равно 123456789, на выходе будет .

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

Вы также можете создавать свои собственные фильтры шаблонов; смотрите How to create custom template tags and filters.

Наследование шаблонов¶

Самая могущественная – и, следовательно, самая сложная – часть механизма шаблонов Django – это наследование шаблонов. Наследование шаблонов позволяет создать вам шаблон-“скелет”, который содержит базовые элементы вашего сайта и определяет блоки, которые могут быть переопределены дочерними шаблонами.

Проще всего понять наследования шаблонов с помощью примера:

<!DOCTYPE html>
<html lang="en">
<head>
    <link rel="stylesheet" href="style.css" />
    <title>{% block title %}My amazing site{% endblock %}</title>
</head>

<body>
    <div id="sidebar">
        {% block sidebar %}
        <ul>
            <li><a href="/">Home</a></li>
            <li><a href="/blog/">Blog</a></li>
        </ul>
        {% endblock %}
    </div>

    <div id="content">
        {% block content %}{% endblock %}
    </div>
</body>
</html>

Этот шаблон, который мы будем называть base.html, определяет HTML структуру документа, которую вы можете использовать для двух-колоночной страницы. Задача “дочернего” шаблона заполнить пустые блоки содержимым.

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

Дочерний шаблон может выглядеть таким образом:

{% extends "base.html" %}

{% block title %}My amazing blog{% endblock %}

{% block content %}
{% for entry in blog_entries %}
    <h2>{{ entry.title }}</h2>
    <p>{{ entry.body }}</p>
{% endfor %}
{% endblock %}

Ключевым здесь есть тег . Он говорит механизму шаблонов, что этот шаблон “наследует” другой шаблон. Когда механизм шаблонов выполняет этот шаблон, первым делом находится родительский шаблон – в этом примере “base.html”.

Далее механизм шаблонов находит три тега в base.html и заменяет их содержимым дочернего шаблона. В зависимости от значения blog_entries, результат может выглядеть таким образом:

<!DOCTYPE html>
<html lang="en">
<head>
    <link rel="stylesheet" href="style.css" />
    <title>My amazing blog</title>
</head>

<body>
    <div id="sidebar">
        <ul>
            <li><a href="/">Home</a></li>
            <li><a href="/blog/">Blog</a></li>
        </ul>
    </div>

    <div id="content">
        <h2>Entry one</h2>
        <p>This is my first entry.</p>

        <h2>Entry two</h2>
        <p>This is my second entry.</p>
    </div>
</body>
</html>

Так как дочерний шаблон не определяет блок sidebar, будет использовано значение из родительского шаблона. Содержимое тега {% block %} родительского шаблона всегда используется как значение по умолчанию.

Вы можете использовать столько уровней наследование, сколько вам нужно. Один из распространенных способов использовать наследование – это трехуровневый подход:

  • Создать шаблон base.html, который отображает основной вид вашего сайта.

  • Создать шаблон base_SECTIONNAME.html для каждого “раздела” вашего сайта. Например, base_news.html, base_sports.html. Все эти шаблоны наследуют base.html и включают стили и дизайн специфические для конкретного раздела.

  • Создание шаблона для каждого типа страницы, такие как новость или запись в блоге. Эти шаблоны наследуют соответствующий шаблон раздела.

Такой подход позволяет максимально использовать существующий код и легко добавлять элементы, такие как элементы навигации специфические для каждого раздела, в общие блоки шаблона.

Вот несколько советов по работе с наследованием:

  • Если вы используете , он должен быть первым тегом в шаблоне. Иначе наследование не будет работать.

  • Чем больше тегов в вашем шаблоне, тем лучше. Помните, дочерний шаблон не обязан определять все блоки родительского, вы можете указать значение по умолчанию для всех блоков, а затем определить в дочернем шаблоне только те, которые необходимы. Лучше иметь больше “hooks”, чем меньше “hooks”.

  • Если вы дублируете содержимое в нескольких шаблонах, возможно вы должны перенести его в тег {% block %} родительского шаблона.

  • Если вам необходимо содержимое блока родительского шаблона, используйте переменную {{ block.super }}. Эта полезно, если вам необходимо дополнить содержимое родительского блока, а не полностью переопределить его. Содержимое {{ block.super }} не будет автоматически экранировано (смотрите ), так как оно уже было экранировано, при необходимости, в родительском шаблоне.

  • Для ясности, вы можете добавить название вашему тегу {% endblock %}. Например:

    {% block content %}
    ...
    {% endblock content %}
    

    В больших шаблонах такой подход поможет вам увидеть какой тег {% block %} был закрыт.

Шаблоны¶

Шаблон — это текстовый файл. Он может генерировать любой текстовый формат (HTML, XML, CSV и т.д.).

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

Ниже приведен минимальный шаблон, иллюстрирующий некоторые основы. Каждый элемент будет объяснен позже в этом документе.

{% extends "base_generic.html" %}

{% block title %}{{ section.title }}{% endblock %}

{% block content %}
<h1>{{ section.title }}</h1>

{% for story in story_list %}
<h2>
  <a href="{{ story.get_absolute_url }}">
    {{ story.headline|upper }}
  </a>
</h2>
<p>{{ story.tease|truncatewords:"100" }}</p>
{% endfor %}
{% endblock %}

Документация Django библиотек

Рецепты Django ORM

Рецепты Django ORM — это книга о работе с моделями Django ORM и Django. Django ORM является одним из ключевых столпов Django. Он предоставляет абстракции …

Django Rest Framework

Django Rest Framework (DRF) — это библиотека, которая работает со стандартными моделями Django для создания гибкого и мощного API для проекта.

Django CMS

Django CMS — это современная платформа для веб-публикаций, построенная на Django, фреймворке веб-приложений «для перфекционистов с соблюдением сроков». Django CMS предлагает готовую поддержку общих функций, …

Channels

Channels — это проект, который использует Django и расширяет его возможности за пределы HTTP — для обработки WebSockets, протоколов чата, IoT-протоколов и многого другого. Он …

ASGI — спецификация и утилиты

ASGI (Asynchronous Server Gateway Interface) является духовным наследником WSGI, предназначенным для обеспечения стандартного интерфейса между асинхронными веб-серверами, платформами и приложениями Python. WSGI предоставил стандарт для …

Python Social Auth

Python Social Auth — это простой в настройке механизм социальной аутентификации/регистрации с поддержкой нескольких платформ и провайдеров аутентификации. Созданный с использованием базового кода из django-social-auth, …

Тэги¶

Теги выглядят так: . Теги более сложны, чем переменные: некоторые создают текст в выходных данных, некоторые управляют потоком, выполняя циклы или логику, а некоторые загружают внешнюю информацию в шаблон для использования последующими переменными.

Для некоторых тегов требуются начальные и конечные теги (например, ).

Django поставляется с двумя десятками встроенных тегов шаблонов. Вы можете прочитать все о них в справочнике по встроенным тегам <ref-templates-builtins-tags>. Чтобы дать вам представление о том, что доступно, вот некоторые из наиболее часто используемых тегов:

Перебераеи каждый элемент в массиве. Например, чтобы отобразить список спортсменов, представленный в :

<ul>
{% for athlete in athlete_list %}
    <li>{{ athlete.name }}</li>
{% endfor %}
</ul>
, , и

Оценивает переменную, и если эта переменная имеет значение «true», отображается содержимое блока:

{% if athlete_list %}
    Number of athletes: {{ athlete_list|length }}
{% elif athlete_in_locker_room_list %}
    Athletes should be out of the locker room soon!
{% else %}
    No athletes.
{% endif %}

В приведенном выше примере, если не пуст, количество спортсменов будет отображаться переменной . В противном случае, если не пуст, будет отображено сообщение «Athletes should be out…». Если оба списка пусты, будет отображаться «No athletes.».

Вы также можете использовать фильтры и различные операторы в теге :

{% if athlete_list|length > 1 %}
   Team: {% for athlete in athlete_list %} ... {% endfor %}
{% else %}
   Athlete: {{ athlete_list.0.name }}
{% endif %}

Хотя приведенный выше пример работает, имейте в виду, что большинство шаблонных фильтров возвращают строки, поэтому математические сравнения с использованием фильтров обычно не работают так, как вы ожидаете. является исключением.

и
Настройте (смотрите ниже), мощный способ сократить количество лишних повторений в шаблонах.

Опять же, приведенное выше — это лишь выборка всего списка; смотрите полный список .

Вы также можете создавать собственные настраиваемые теги шаблонов; смотрите How to create custom template tags and filters.

Тэги¶

Теги выглядят так: . Теги более сложны, чем переменные: некоторые создают текст в выходных данных, некоторые управляют потоком, выполняя циклы или логику, а некоторые загружают внешнюю информацию в шаблон для использования последующими переменными.

Для некоторых тегов требуются начальные и конечные теги (например, ).

Django поставляется с двумя десятками встроенных тегов шаблонов. Вы можете прочитать все о них в справочнике по встроенным тегам <ref-templates-builtins-tags>. Чтобы дать вам представление о том, что доступно, вот некоторые из наиболее часто используемых тегов:

Перебераеи каждый элемент в массиве. Например, чтобы отобразить список спортсменов, представленный в :

<ul>
{% for athlete in athlete_list %}
    <li>{{ athlete.name }}</li>
{% endfor %}
</ul>
, , и

Оценивает переменную, и если эта переменная имеет значение «true», отображается содержимое блока:

{% if athlete_list %}
    Number of athletes: {{ athlete_list|length }}
{% elif athlete_in_locker_room_list %}
    Athletes should be out of the locker room soon!
{% else %}
    No athletes.
{% endif %}

В приведенном выше примере, если не пуст, количество спортсменов будет отображаться переменной . В противном случае, если не пуст, будет отображено сообщение «Athletes should be out…». Если оба списка пусты, будет отображаться «No athletes.».

Вы также можете использовать фильтры и различные операторы в теге :

{% if athlete_list|length > 1 %}
   Team: {% for athlete in athlete_list %} ... {% endfor %}
{% else %}
   Athlete: {{ athlete_list.0.name }}
{% endif %}

Хотя приведенный выше пример работает, имейте в виду, что большинство шаблонных фильтров возвращают строки, поэтому математические сравнения с использованием фильтров обычно не работают так, как вы ожидаете. является исключением.

и
Настройте (смотрите ниже), мощный способ сократить количество лишних повторений в шаблонах.

Опять же, приведенное выше — это лишь выборка всего списка; смотрите полный список .

Вы также можете создавать собственные настраиваемые теги шаблонов; смотрите Пользовательские теги и фильтры шаблонов.

Рейтинг
( Пока оценок нет )
Понравилась статья? Поделиться с друзьями:
Мой редактор ОС
Добавить комментарий

;-) :| :x :twisted: :smile: :shock: :sad: :roll: :razz: :oops: :o :mrgreen: :lol: :idea: :grin: :evil: :cry: :cool: :arrow: :???: :?: :!: