Django: шпаргалка с полезностями
В этой статье осуществлена попытка собрать полезности, по работе с популярным web-фреймворком на Python.
Поводом к ее написанию стало прочтение серии из семи замечательных статей, написанных Vitor Freitas в блоге simpleisbetterthancomplex.com. По мере прочтения стало понятно, что вся информация в голове не уляжется и нужно складывать ее в более для того подходящее хранилище.
Команды django-admin и manage.py
Этот перечень ни в коем случае не является полным, здесь приведены наиболее часто используемые команды.
django-admin startproject myproject - создать новый проект (генерирует структуру)
python manage.py runserver - запустить тестовый сервер (на http://127.0.0.1:8000)
python manage.py runserver 0.0.0.0:80 - запустить тестовый сервер доступный извне (не
злоупотреблять)
django-admin startapp myapp - создать приложение в текущем проекте
django-admin makemessages - сгенерировать файлы с сообщениями подлежащими локализации
django-admin compilemessages - скомпилировать файлы локализации
python manage.py makemigrations - создать файлы миграций для БД
python manage.py sqlmigrate app 0001 - просмотр sql-кода, сгенерированного в миграции 0001
приложения app
python manage.py shell - запустить окно командной строки
python manage.py test - прогнать тесты (для прогона будет создана чистая БД)
python manage.py test --verbosity=2 - управление детализацией вывода при тестах (2-макс, 0 - мин)
python manage.py createsuperuser - создать пользователя-администратора
Операции с моделями
В примерах ниже Board - класс, board - экземпляр класса.
Операция Пример кода
Создать обьект без сохранения board = Board()
Сохранить обьект (создать или обновить) board.save()
Создать обьект и сохранить в базу Board.objects.create(name='...', desc='...')
Получить список всех обьектов Board.objects.all()
Получить список обьектов, фильтр по полю Board.objects.get(id=1)
Шаблоны тестов
Проверка HTTP-кода ответа для адреса с alias-ом home.
from django.core.urlresolvers import reverse
from django.test import TestCase
class HomeTests(TestCase):
def test_home_view_status_code(self):
url = reverse('home')
response = self.client.get(url)
self.assertEquals(response.status_code, 200)
Проверка, что URL вызывает правильную view
def test_home_url_resolves_home_view(self):
view = resolve('/')
self.assertEquals(view.func, home)
Шаблоны регулярных выражений для URL
В этом разделе приведены несколько примеров наиболее часто используемых шаблонов для файла urls.py.
Автогенерируемый первичный ключ
Регулярное выражение:
(?P<pk>\d+)
Пример использования:
url(r'^questions/(?P<pk>\d+)/$', views.question_details, name='question_details'),
Подходит | Не подходит | |
URL | Будет извлечено | URL |
/questions/0/ |
{'pk': '0'} | /questions/-1/ |
/questions/1/ |
{'pk': '1'} | /questions/test-1/ |
/questions/934/ |
{'pk': '934'} | /questions/abcdef/ |
Текстовая ссылка (ЧПУ)
Регулярное выражение:
(?P<slug>[-\w]+)-(?P<pk>\d+)
Пример использования:
url(r'^blog/(?P<slug>[-\w]+)-(?P<pk>\d+)/$', views.blog_post, name='blog_post'),
Подходит | Не подходит | |
URL | Будет извлечено | URL |
/blog/hello-world-159/ |
{'slug': 'hello-world', 'pk': '159'} |
/blog/hello-world/ |
/blog/a-0/ |
{'slug': 'a', 'pk': '0'} |
/blog/1/ |
/blog/helloworld1/ |
||
/hello-world-1-test/ |
Имя пользователя
Регулярное выражение:
(?P<username>[\w.@+-]+)
Пример использования:
url(r'^profile/(?P<username>[\w.@+-]+)/$', views.user_profile),
Подходит | Не подходит | |
URL | Будет извлечено | URL |
/profile/vitorfs/ |
{'username': 'vitorfs'} |
/profile/*vitorfs/ |
/profile/vitor.fs/ |
{'username': 'vitor.fs'} |
/profile/$vitorfs/ |
/profile/@vitorfs/ |
{'username': '@vitorfs'} |
/profile/vitor fs/ |
Год
Регулярное выражение:
(?P<year>[0-9]{4})
Пример использования:
url(r'^articles/(?P<year>[0-9]{4})/$', views.year_archive)
Подходит | Не подходит | |
URL | Будет извлечено | URL |
/articles/2016/ |
{'year': '2016'} |
/articles/999/ |
/articles/9999/ |
{'year': '9999'} |
Год/месяц
Регулярное выражение:
(?P<year>[0-9]{4})/(?P<month>[0-9]{2})
Пример использования:
url(r'^articles/(?P<year>[0-9]{4})/(?P<month>[0-9]{2})/$', views.month_archive),
Подходит | Не подходит | |
URL | Будет извлечено | URL |
/articles/2016/01/ |
{'year': '2016', 'month': '01'} |
/articles/2016/1/ |
/articles/2016/12/ |
{'year': '2016', 'month': '12'} |
Год / месяц / день
Регулярное выражение:
(?P<year>[0-9]{4})/(?P<month>[0-9]{2})/(?P<day>[0-9]{2})
Пример использования:
url(r'^articles/(?P<year>[0-9]{4})/(?P<month>[0-9]{2})/(?P<day>[0-9]{2})/$', views.article_detail)
Подходит | Не подходит | |
URL | Будет извлечено | URL |
/articles/2016/01/01/ |
{'year': '2016', 'month': '01', day: '01'} |
/articles/2016/01/9/ |
/articles/2016/02/28/ |
{'year': '2016', 'month': '02', 'day': '28'} |
/articles/2016/01/290/ |
/articles/9999/99/99/ |
{'year': '9999', 'month': '99', 'day': '99'} |
Переиспользуемые шаблоны (Templates)
Шаблон для рендеринга формы, поддерживающий отображение валидности/невалидности полей, подсказок к полям, ошибок. Использует классы bootstrap4 и плагин widget-tweaks.
{% load widget_tweaks %}
{% for field in form %}
<div class="form-group">
{{ field.label_tag }}
{% if form.is_bound %}
{% if field.errors %}
{% render_field field class="form-control is-invalid" %}
{% for error in field.errors %}
<div class="invalid-feedback">
{{ error }}
</div>
{% endfor %}
{% else %}
{% render_field field class="form-control is-valid" %}
{% endif %}
{% else %}
{% render_field field class="form-control" %}
{% endif %}
{% if field.help_text %}
<small class="form-text text-muted">
{{ field.help_text }}
</small>
{% endif %}
</div>
{% endfor %}
Полезные дополнения/расширения Django
django-widget-tweaks
Позволяет управлять рендерингом элементов форм в шаблонах, а не в коде форм. Дает возможность добавлять CSS-классы и HTML- аттрибуты. Лицензия MIT.
pip install django-widget-tweaks
awesome-slugify
Позволяет преобразовывать строки, включающие не-ASCII символы в строки для URL. Лицензия GNU GPLv3.
Например, так:
from slugify import slugify
slugify('Я борщ', to_lower=True) # ya-borsch
pip install awesome-slugify