Pular para o conteúdo
dicas de djangopor Regis do Python

Dica 2 - Django extensions

5 min de leitura
Assistir ao vídeo no YouTube: Dica 2 - Django extensions

Versões usadas no vídeo: Django 2.2.13, django-extensions 2.2.9 e Python 3.8.2.

Documentação: https://django-extensions.readthedocs.io/en/latest/index.html

O django-extensions é uma coleção de extensões para o Django: dezenas de comandos novos para o manage.py, campos extras para os models, extensões para o admin e mais. É daquelas bibliotecas que entram em praticamente todo projeto, porque aumentam a produtividade no dia a dia.

Nesta dica vamos instalar o django-extensions e usar os dois comandos que o autor mais usa: show_urls e shell_plus.

Pré-requisitos

Um projeto Django qualquer. No vídeo, o projeto foi criado com o boilerplatesimple.sh da Dica 1:

mkdir /tmp/c
cd /tmp/c

curl https://gist.githubusercontent.com/rg3915/b363f5c4a998f42901705b23ccf4b8e8/raw/b759d5a4c1dd471a1c1851c2a9e7cbc705f11ac1/boilerplatesimple.sh -o boilerplatesimple.sh
source boilerplatesimple.sh

O script cria a virtualenv, instala o Django 2.2.13 e cria o projeto myproject com o app core e o superusuário admin.

Instalação

pip install django-extensions

O boilerplate já instala o django-extensions, por isso no vídeo o pip responde que ele já está instalado:

Requirement already satisfied: django-extensions in ./.venv/lib/python3.8/site-packages (2.2.9)
Requirement already satisfied: six>=1.2 in ./.venv/lib/python3.8/site-packages (from django-extensions) (1.15.0)

Depois, acrescente django_extensions (com underline) ao INSTALLED_APPS:

# settings.py
INSTALLED_APPS = (
    ...
    'django_extensions',
)

No projeto do boilerplate ele já está lá:

# myproject/settings.py
INSTALLED_APPS = [
    'django.contrib.admin',
    'django.contrib.auth',
    'django.contrib.contenttypes',
    'django.contrib.sessions',
    'django.contrib.messages',
    'django.contrib.staticfiles',
    'django_extensions',
    'myproject.core'
]

Os novos comandos

Rode o manage.py sem argumentos (ou python manage.py help) para ver todos os comandos disponíveis:

python manage.py

Além dos comandos que o Django já tem ([auth], [django], [sessions], [staticfiles] etc.), aparece uma seção nova, [django_extensions]:

[django_extensions]
    admin_generator
    clean_pyc
    clear_cache
    compile_pyc
    create_command
    create_jobs
    create_template_tags
    delete_squashed_migrations
    describe_form
    drop_test_database
    dumpscript
    export_emails
    find_template
    generate_password
    generate_secret_key
    graph_models
    mail_debug
    merge_model_instances
    notes
    passwd
    pipchecker
    print_settings
    print_user_for_session
    reset_db
    reset_schema
    runjob
    runjobs
    runprofileserver
    runscript
    runserver_plus
    set_default_site
    set_fake_emails
    set_fake_passwords
    shell_plus
    show_template_tags
    show_templatetags
    show_urls
    sqlcreate
    sqldiff
    sqldsn
    sync_s3
    syncdata
    unreferenced_files
    update_permissions
    validate_templates

Cada um está explicado na documentação dos comandos.

show_urls

O show_urls lista todas as URLs do projeto, com a view que atende cada uma e o nome da rota. É ótimo para mapear as URLs de um projeto que você não conhece:

python manage.py show_urls

Neste projeto ainda só existem as URLs do admin:

/admin/ django.contrib.admin.sites.index    admin:index
/admin/<app_label>/ django.contrib.admin.sites.app_index    admin:app_list
/admin/auth/group/  django.contrib.admin.options.changelist_view    admin:auth_group_changelist
/admin/auth/group/<path:object_id>/ django.views.generic.base.RedirectView
/admin/auth/group/<path:object_id>/change/  django.contrib.admin.options.change_view    admin:auth_group_change
/admin/auth/group/<path:object_id>/delete/  django.contrib.admin.options.delete_view    admin:auth_group_delete
/admin/auth/group/<path:object_id>/history/ django.contrib.admin.options.history_view   admin:auth_group_history
/admin/auth/group/add/  django.contrib.admin.options.add_view   admin:auth_group_add
/admin/auth/group/autocomplete/ django.contrib.admin.options.autocomplete_view  admin:auth_group_autocomplete
/admin/auth/user/   django.contrib.admin.options.changelist_view    admin:auth_user_changelist
/admin/auth/user/<id>/password/ django.contrib.auth.admin.user_change_password  admin:auth_user_password_change
/admin/auth/user/<path:object_id>/  django.views.generic.base.RedirectView
/admin/auth/user/<path:object_id>/change/   django.contrib.admin.options.change_view    admin:auth_user_change
/admin/auth/user/<path:object_id>/delete/   django.contrib.admin.options.delete_view    admin:auth_user_delete
/admin/auth/user/<path:object_id>/history/  django.contrib.admin.options.history_view   admin:auth_user_history
/admin/auth/user/add/   django.contrib.auth.admin.add_view  admin:auth_user_add
/admin/auth/user/autocomplete/  django.contrib.admin.options.autocomplete_view  admin:auth_user_autocomplete
/admin/jsi18n/  django.contrib.admin.sites.i18n_javascript  admin:jsi18n
/admin/login/   django.contrib.admin.sites.login    admin:login
/admin/logout/  django.contrib.admin.sites.logout   admin:logout
/admin/password_change/ django.contrib.admin.sites.password_change  admin:password_change
/admin/password_change/done/    django.contrib.admin.sites.password_change_done admin:password_change_done
/admin/r/<int:content_type_id>/<path:object_id>/    django.contrib.contenttypes.views.shortcut  admin:view_on_site

São três colunas: a URL, a view e o nome (namespace:nome), o mesmo que você usa no {% url %} e no reverse().

shell_plus

O shell_plus é o shell do Django com uma vantagem: ele já importa automaticamente todos os models de todos os apps instalados e os módulos mais usados do Django. Não é preciso digitar nenhum import:

python manage.py shell_plus
# Shell Plus Model Imports
from django.contrib.admin.models import LogEntry
from django.contrib.auth.models import Group, Permission, User
from django.contrib.contenttypes.models import ContentType
from django.contrib.sessions.models import Session
# Shell Plus Django Imports
from django.core.cache import cache
from django.conf import settings
from django.contrib.auth import get_user_model
from django.db import transaction
from django.db.models import Avg, Case, Count, F, Max, Min, Prefetch, Q, Sum, When, Exists, OuterRef, Subquery
from django.utils import timezone
from django.urls import reverse
Python 3.8.2 (default, Apr 29 2020, 23:19:54)
[GCC 9.2.1 20191008] on linux
Type "help", "copyright", "credits" or "license" for more information.
(InteractiveConsole)
>>>

Repare que o User já foi importado (from django.contrib.auth.models import Group, Permission, User). Então dá para consultar direto:

>>> User.objects.all()
<QuerySet [<User: admin>]>

Quando você criar models nos seus apps, eles também aparecem na seção # Shell Plus Model Imports.

Conclusão

Com duas linhas (o pip install e o INSTALLED_APPS) você ganha dezenas de comandos. Os dois que mais ajudam no dia a dia:

python manage.py show_urls
python manage.py shell_plus

Sugerir uma correção nesta página