Рубрики
Без рубрики

Шаблоны Django: Лучшие практики

На практике шаблоны Django – это просто HTML-файлы, с некоторым специальным синтаксисом и набором инструментов, которые позволяет Django представлять HTML-страницу на лету для посещения пользователя. Теги с Джанго, Питоном, Вебдевым, Новичком.

Учебники Django на блоге Kite (4 части серии)

Введение в шаблоны Django

Django, как веб-каркас, использует шаблоны как способ получения статического HTML с вывода вида Django. На практике шаблоны Django – это просто HTML-файлы, с некоторым специальным синтаксисом и набором инструментов, которые позволяет Django представлять HTML-страницу на лету для посещения пользователя. Шаблоны очень настраиваются, но предназначены для простых, причем большая часть «тяжелой» логики происходит в поле зрения. Давайте погрузиться глубже и изучать некоторые стандартные способы борьбы с общими проблемами.

Простое начало с шаблонами Django

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

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

Примеры тегов *: *

{% firstof user.is_active user.is_staff user.is_deleted %}

Firstof Теги выводят первую предоставляемую переменную, которая оценивает Истинный . Это хорошая замена для большого Если/ELIF/ELIF/ELIF/ELIF Блок, который просто оценивает правду в ваших шаблонах Django.

    {% for product in product_list %}
  • {{ product.name }}: ${{ product.price }}
  • {% endfor %}

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

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

Примеры фильтров *: *

{{ value|date:'D d M Y' }}

Дата Фильтр отформатирует дату ( Value в примере) дано строку с некоторыми символами формата. Примером выводят строку: Пн 01. Апрель 2019 Отказ

{{ value|slugify }}

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

Структура проекта

Django по умолчанию сделает некоторые предположения о структуре нашего проекта, когда он ищет шаблоны. Зная это, мы можем настроить наш проект с Справочник шаблона и Шаблон приложений Каталоги Отказ

Представьте себе проект, облако *, * со следующей структурой:

cloud/
    accounts/
        urls.py
        models.py
        views.py
        templates/
            accounts/
                login.html
                register.html
    blog/
        urls.py
        views.py
        models.py
        templates/
            blog/
                create.html
                post.html
                list.html
    config/
        settings/
            base.py
            local.py
        urls.py
    manage.py
    templates/
        includes/
            messages.html
            modal.html
        base.html
        logged_in.html

Как наследование работает для шаблонов Django

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

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

Например, base.html может содержать:

{% load static %}




  
  
  {% block page_meta %}
  {% endblock %}

  {# Vendor styles #}
  {% block vendor_css %}
    
  {% endblock %}

  {# Global styles #}
  {% block site_css %}
    
  {% endblock %}

  {# Page-specific styles #}
  {% autoescape off %}
    {% block page_css %}{% endblock %}
  {% endautoescape %}

  {% block extra_head %}
    {# Extra header stuff (scripts, styles, metadata, etc) #}
  {% endblock %}

  {% block page_title %}{% endblock %}


{% block body %}
    {# Page content will go here #}
{% endblock %}

{# Modal HTML #}
{% block modals %}
{% endblock %}

{# Vendor javascript #}
{% block vendor_js %}
  
{% endblock %}

{# Global javascript #}
{% block site_js %}
  
{% endblock %}

{# Shared data for javascript #}


{# Page javascript #}
{% autoescape off %}
  {% block page_js %}
  {% endblock %}
{% endautoescape %}


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

Мы используем Django’s autoescape Teamplate TAG Окружающие блоки, где мы не хотим Django autoescape наш HTML-теги или JavaScript, а скорее обрабатывают содержимое блока буквально.

Наше shared_data Блок позволяет нам заполнить глобальный объект JavaScript с переменными и данными, которые мы можем захотеть поделиться между Django и любым запуском JavaScript на странице (например, заполнение компонентов React или Vue.js.)

Например, если мы хотели пройти URL Django к одному из наших файлов JavaScript, мы могли бы сделать что-то подобное:

{% extends 'base.html' %}

{% block shared_data %}
  {{ block.super }}
  'USERS_AUTOCOMPLETE_ENDPOINT': '{% url 'api:users:autocomplete' %}',
{% endblock %}

Django загружает страницу и возвращает в объекте JavaScript, который вы можете использовать в файлах JavaScript на странице:


Внутри консоли JS после нагрузки страницы:

>> window._sharedData.DEBUG
false
>> window._sharedData.USERS_AUTOCOMPLETE_ENDPOINT
'/api/users/autocomplete/'

Обработка запросов

Правильно обработка запросов в ваших шаблонах может быть узким местом для работы для Django в зависимости от сложностей ваших определений модели.

Система шаблонов шаблонов Django тесно связана с объектом Django Object-Relational Mapping Player, который возвращает данные США из базы данных. Без надлежащего рассмотрения этой связи вы можете непреднамеренно, привести к тому количеству запросов на каждой странице, чтобы перейти к неизвестнимым количествам. В некоторых случаях это может привести к тому, что база данных становится слишком вялым, чтобы управлять определенными страницами на вашем сайте, или хуже, аварии и необходимо перезапустить.

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

Рассмотрим этот общий шаблон Django:

Счета/просмотр

class UserListView(ListView):
    template_name = 'accounts/list.html'
    model = User
    paginate_by = 25
    context_object_name = 'users'
    queryset = User.objects.all()

Учетные записи/шаблоны/учетные записи/List.html

...

  {% for user in users %}
    
  {% endfor %}
  
Username Email Profile photo URL Joined
{{ user.username }} {{ user.email_address }} {{ user.profile.avatar_url }} {{ user.created_at }}
...

Можете ли вы обнаружить проблему? Сначала это не может быть очевидно, но посмотрите на эту строку:

{{ user.profile.avatar_url }}

Когда Django обрабатывает и рендеринг нашего шаблона (линия по линии), ему нужно будет сделать дополнительный запрос, чтобы получить информацию из Профиль объект как это связанное поле. В нашем примере представление мы нарабатываем по 25 пользователям, поэтому эта одна строка в шаблоне может объяснить дополнительные 25 запросов (на каждой странице запрос в качестве объекта профиля, как со всеми связанными объектами и моделями в Django), которые aren ‘ T включен в исходный запрос для 25 пользователей. Вы можете представить, как это может стать очень медленной страницей, если мы были включены поля из других связанных объектов в нашем столе, или если мы использовали 100 пользователей вместо 25.

Чтобы разрешить это, мы изменим одну строку на наш взгляд, Счета/просмотр .py до Выберите Связанные Объекты, когда мы используем наш оригинальный запрос для пользователей:

class UserListView(ListView):
    template_name = 'accounts/list.html'
    model = User
    paginate_by = 25
    context_object_name = 'users'
    queryset = User.objects.select_related('profile')

Заменив наши User.Objects.all () с User.Objects.slect_related («Профиль») , мы сообщаем Django, чтобы включить следующие случаи профиля, когда он выполняет его запрос для наших пользователей. Это будет включать Профиль Модель на каждом Пользователь Экземпляр, предотвращая необходимость Django для запуска дополнительного запроса каждый раз, когда мы просим информацию из профиля в шаблоне.

Джанго select_related Функциональные возможности не работают со многими ко многими модельными отношениями или со многими к одному отношениям. Для этого мы хотели бы использовать Django’s Prefetch_related метод.

В отличие от select_related , Prefetch_related Соответствует ли его магии в Python, в отличие от операторов SQL Select, присоединившись к связанным объектам в экземпляры, которые могут быть доступны в шаблонах, которые мы сделали выше. Это не выполняет вещи в одном запросе, как select_related умеет, но это гораздо более эффективно, чем запуск запроса каждый раз, когда вы запрашиваете связанный атрибут.

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

… Проверьте Полная статья и исходный код От kite.com!

Зак Clancy является вице-президентом на глобальной грязи (команда немедленного реагирования на бедствие)

Учебники Django на блоге Kite (4 части серии)

Оригинал: “https://dev.to/kite/django-templates-best-practices-1e25”