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