Книга о Django на русском/examples/Последние примеры с Russian DjangoBookru-RUTue, 31 May 2022 06:28:36 -0000Python 3.8/examples/156/Подробности на &lt;a <a href="http://href=&quot;https://docs.python.org/3.8/whatsnew/3.8.html%22%3E%D0%B0%D0%BD%D0%B3%D0%BB%D0%B8%D0%B9%D1%81%D0%BA%D0%BE%D0%BC" rel="nofollow">href=&quot;https://docs.python.org/3.8/whatsnew/3.8.html&quot;&gt;английском</a> языке&lt;/a&gt;.<br />Ниже переведено только необходимое, можете добавлять в комментариях.<br />Моржовый оператор<br />Выражения присваивания пришли в Python с оператором &quot;морж&quot;, то есть :=. Данный оператор позволяет вам присваивать значения переменной как часть выражения. Основной выигрыш применения этого оператора состоит в сокращении количества строк, которые вам потребуется написать.<br />Раньше писали так:<br />line = f.readline()<br />while line:<br /> ... # process line<br /> line = f.readline()<br /><br />теперь можно так:<br />while line := f.readline():<br /> ... # process line<br /><br />Кратко, но некоторые говорят, что первый вариант понятнее.<br />Только позиционные аргументы<br />Специальный маркер / можно использовать для определения аргументов .../examples/156/Разыскиваются разработчики Django/news/342/Пишите в телеграм: <a href="https://t.me/" rel="nofollow">https://t.me/</a><br />Требования:<br /><br />Опыт работы с Python3, Django, PostgreSQL от 3 лет<br />Опыт работы с Django Rest Framework<br />Опыт работы с Redis, Tornado, Celery<br />Опыт настройки Nginx<br />Опыт работы с JS, JQuery<br />Опыт проектирования архитектуры приложения<br />Умение перенести репозиторий на новый сервер по полному циклу<br />Опыт работы с Git<br />Умение разбираться в чужом коде.<br />Опыт разработки сложных проектов, умение оптимизировать запросы.<br />Умение составлять сложные SQL-запросы<br />Знание регулярных выражений.<br />Знание HTML/CSS/JS, исправления и доработка верстки<br />Английский язык на техническом уровне.<br /><br />В общем, всё стандартно. Проекты разные, варианты сотрудничества тоже./news/342/Дата с помощью <input type="date">/examples/152/По умолчанию, поле формы forms.DateField использует виджет forms.TextInput. Для добавления обычного способа выбора/ввода даты нам нужно создать собственный виджет. Наследуемся от forms.DateInput.<br />class DateInputWidget(forms.DateInput):<br /> input_type = &#39;date&#39;<br /><br /> def format_value(self, value):<br /> return value<br /><br />Свойство input_type = &#39;date&#39; задаёт атрибут type для html-тега input. Если у нас есть какое-то начальное значение для поля, метод format_value по умолчанию устанавливает в качестве значения для input локализованную дату (если в settings.py USE_L10N установлен в True). Что-то типа ДД.ММ.ГГГГ. Браузер же требует формат ГГГГ-ММ-ДД и потому не будет отображать начальное значение.<br />Чтобы этого избежать, переопределяем метод format_value, заставляя .../examples/152/Проект закрывается/news/341/С предложениями по обмену проекта на яхту пишите в телеграм @ruslanpopov.../news/341/Введение/examples/122/Инфраструктура<br />DevOps создаёт инфраструктуру разработки:<br /><br />сервис для управления пользователями и их правами: OpenLDAP и т.д.<br />сервис для управления репозиториями: &lt;a <a href="http://href=&quot;https://about.gitlab.com/%22%3EGitLab%3C/a" rel="nofollow">href=&quot;https://about.gitlab.com/&quot;&gt;GitLab&lt;/a</a>&gt;, &lt;a href=&quot;https://gitea.io/&quot;&gt;Gitea&lt;/a&gt; и т.д.<br />сервис для базы знаний: &lt;a <a href="http://href=&quot;https://www.atlassian.com/software/confluence%22%3EConfluence%3C/a" rel="nofollow">href=&quot;https://www.atlassian.com/software/confluence&quot;&gt;Confluence&lt;/a</a>&gt;, &lt;a <a href="http://href=&quot;https://www.dokuwiki.org/dokuwiki%22%3EDokuWiki%3C/a" rel="nofollow">href=&quot;https://www.dokuwiki.org/dokuwiki&quot;&gt;DokuWiki&lt;/a</a>&gt; и т.д.<br />сервис для управления задачами: &lt;a <a href="http://href=&quot;https://www.atlassian.com/ru/software/jira%22%3EJira%3C/a" rel="nofollow">href=&quot;https://www.atlassian.com/ru/software/jira&quot;&gt;Jira&lt;/a</a>&gt; и т.д.<br />сервис для автоматического тестирования, сборки и деплоя: &lt;a <a href="http://href=&quot;https://about.gitlab.com/%22%3EGitlab%3C/a" rel="nofollow">href=&quot;https://about.gitlab.com/&quot;&gt;Gitlab&lt;/a</a>&gt;, &lt;a .../examples/122/В Марокко в июне/news/340/<br />Камрады, еду в тур по Марокко с 12 по 19 июня 2021! Давайте со мной. Скидка по промокоду &quot;DJBOOK&quot; 5%!<br />А именинникам ещё 5 % ;)<br /><a href="https://wintours.guru/" rel="nofollow">https://wintours.guru/</a>/news/340/pdb – Интерактивный отладчик/examples/114/Версии Python: 1.4 и выше<br />Отладчик pdb является интерактивной средой отладки для программ на Python. Он включает возможности приостановки выполнения программы, просмотра значений переменных, построчного выполнения кода так, что вы можете понять, чем ваша программа на самом деле занимается, и найти логические ошибки.<br />Запуск отладчика<br />Для начала использования pdb необходимо указать интерпретатору, как и когда мы хотим увидеть отладчик. Существует несколько способов это сделать, в зависимости от условий запуска, а также требований к отладке.<br />Из командной строки<br />Самый очевидный метод использования отладчика — запускать его из командной строки, передавая вашу программу параметром так, чтобы он знал, что запускать.<br /># encoding: utf-8 .../examples/114/Конфигурация/examples/111/Конфигурация - одна из важнейших частей проекта. С него он начинается. Именно конфигурацией вы определяете с какой базой данных надо работать, какие приложения использовать, как форматировать время, как переводить ресурсы и на какие языки, и многое другое.<br />Решением, проверенным временем и множеством проектов, является передача конфигурационных параметров через переменные окружения. Внутри файла settings.py остаётся только их правильно прочитать из окружения и применить.<br />Для получения булевых данных из переменной окружения используем функцию:<br />import os<br /><br />def getenv_boolean(name: str, default: bool=False) -&amp;gt; bool:<br /> value = os.getenv(name, default)<br /> if isinstance(value, str):<br /> return value.lower() == &#39;true&#39;<br /> return value<br /><br />Для получения строковых .../examples/111/Починили регистрацию пользователя/news/339/Оказывается, при переезде со старого хостинга, мы не настроили почтовый сервер и много лет жили спокойно ;)<br />Но нашёлся один пользователь в сети, которому очень хотелось задать вопрос на форуме, и нам пришлось починить. Этак мы и переводами опять займёмся. Что с людьми делает короновирус.../news/339/Docker/examples/109/Docker<br />Я буду объяснять максимально упрощённо. Сложные варианты вы можете почитать на &lt;a <a href="http://href=&quot;https://docker.com/%22%3E%D0%BE%D1%84%D0%B8%D1%86%D0%B8%D0%B0%D0%BB%D1%8C%D0%BD%D0%BE%D0%BC" rel="nofollow">href=&quot;https://docker.com/&quot;&gt;официальном</a> сайте&lt;/a&gt; или на хабре.<br />Докер - это такой проигрыватель для контейнеров. Контейнеры создаются при запуске образов. Самое главное, что надо понять для Linux хоста, контейнеры исполняются вместе с остальными процессами системы, виртуализируется только файловая система и сетевая.<br />Также существует &lt;a <a href="http://href=&quot;https://ru.wikipedia.org/wiki/LXC%22%3ELXC%3C/a" rel="nofollow">href=&quot;https://ru.wikipedia.org/wiki/LXC&quot;&gt;LXC&lt;/a</a>&gt;, если вам это интересно, идите и читайте, здесь будет про докер.<br />Контейнер<br />Контейнер - это некий кусок программного обеспечения, такой пакет с кодом и его зависимостями, который позволяет максимально просто доставить приложение в нужное .../examples/109/Docker - наше всё/news/338/За время затишья на этом сайте, мы получили много опыта в разработке микросервисов на основе Docker. Есть возможность начать цикл статей по контейнеризации Django, СI/CD и прочей магии. Жду комментариев.../news/338/Создание проекта/examples/104/Создание проекта<br />Создаём окружение и ставим Django:<br />mkdir -p ~/devel/project<br />cd /devel/project<br />pipenv install django<br /><br />Появляются два файла: Pipfile и Pipfile.lock.<br />Создаём README.md с содержимым:<br /># Project<br /><br />Django powered ;)<br /><br />Создаём репозиторий и коммитим всё туда:<br />git init<br />git add Pipfile Pipfile.lock README.md<br />git commit -m &quot;Initial commit&quot;<br /><br />Далее выполняем коммиты так, чтобы по ним можно было проследить развитие проекта.<br />Немного расширяем возможности Pipfile:<br />[[source]]<br />name = &quot;pypi&quot;<br />url = &quot;<a href="https://pypi.org/simple" rel="nofollow">https://pypi.org/simple</a>&quot;<br />verify_ssl = true<br /><br />[dev-packages]<br /><br />[packages]<br />django = &quot;*&quot;<br /><br />[requires]<br />python_version = &quot;3.8&quot;<br /><br />[scripts]<br />manage = &quot;./manage.py&quot;<br />shell = &quot;./manage.py shell&quot;<br />migrate .../examples/104/Использование UUID в качестве PK/examples/103/При разработке сервиса очень полезно иметь UUID в качестве первичного ключа.<br />В Django 2.2 это можно сделать как и раньше, но без реализации метода сохранения модели:<br />import uuid<br /><br />class AbstractUUID(models.Model):<br /> &quot;&quot;&quot; Абстрактная модель для использования UUID в качестве PK.&quot;&quot;&quot;<br /><br /> # Параметр blank=True позволяет работать с формами, он никогда не<br /> # будет пустым, см. метод save()<br /><br /> id = models.UUIDField(primary_key=True, default=uuid.uuid4, editable=False)<br /><br /> class Meta:<br /> abstract = True<br /><br />Пример использования:<br />from django.db import models<br />from .mixins import AbstractUUID<br /><br />class SomeModel(AbstractUUID):<br /> pass<br />/examples/103/Начинаем Django проекты правильно/examples/94/Доклад о том, как правильно начинать Django проекты<br />Что внутри?<br />- django с максимально безопасными настройками<br />- poetry для управления зависимостями<br />- mypy для опциональной проверки типов<br />- pytest для тестов<br />- flake8 и wemake-python-styleguide для линтинга<br />- docker для разработки, тестирования и продакшена <br />- sphinx для документации<br />- Gitlab CI полностью настроен для тестирования и деплоя<br />Видео: <a href="https://www.youtube.com/watch?v=vDshhQnXSfM" rel="nofollow">https://www.youtube.com/watch?v=vDshhQnXSfM</a><br />Репозиторий: <a href="https://github.com/wemake-services/wemake-django-template" rel="nofollow">https://github.com/wemake-services/wemake-django-template</a>/examples/94/Поле указания цвета средствами django./examples/93/Что бы в админке был виджет указания цвета.<br />Рецепт найден где-то на просторах сети.<br /># model.py<br /><br />class Pages(CommonInfo):<br />...<br />color = fields.ColorField(&#39;Цвет обложки&#39;, default=&#39;#FF0000&#39;)<br />def colortile(self):<br /> if self.color:<br /> return format_html(&#39;&amp;lt;div style=&quot;background-color: {0}; \<br /> height: 100px; width: 100px&quot;&amp;gt;&amp;lt;/div&amp;gt;&#39;, self.color)<br /> return &#39;пусто&#39;<br /><br />В fields.py<br />from django.db import models<br />from django.core import validators<br /><br />class ColorField(models.CharField):<br /> &quot;&quot;&quot; Поле для хранения HTML-кода цвета.&quot;&quot;&quot;<br /><br /> def __init__(self, *args, **kwargs):<br /> kwargs.setdefault(&#39;max_length&#39;, 7)<br /> super().__init__(*args, **kwargs)<br /> self.validators.append(validators.RegexValidator(r&#39;#[a-f\d]{6}&#39;))<br /><br />В админке .../examples/93/