Criando ações na lista de ações do Django Admin

  • 7 de Agosto de 2018
  • Em Django

Vamos criar uma ação no list view do admin do django para que uma determinação função seja executada em um ou mais objetos selecionados

Comece criando um novo virtual env para o projeto e ativando-o

$ virtualenv -p python3 venv 
$ source venv/bin/activate

Agora vamos instalar o Django

$ pip install django
Collecting django
  Downloading https://files.pythonhosted.org/packages/51/1a/e0ac7886c7123a03814178d7517dc822af0fe51a72e1a6bff26153103322/Django-2.1-py3-none-any.whl (7.3MB)
    100% |████████████████████████████████| 7.3MB 128kB/s 
Collecting pytz (from django)
  Downloading https://files.pythonhosted.org/packages/30/4e/27c34b62430286c6d59177a0842ed90dc789ce5d1ed740887653b898779a/pytz-2018.5-py2.py3-none-any.whl (510kB)
    100% |████████████████████████████████| 512kB 125kB/s 
Installing collected packages: pytz, django
Successfully installed django-2.1 pytz-2018.5


Vamos criar um projeto, o ponto no final do comando é para o django-admin colocar o script manage.py no diretorio atual

$ django-admin startproject myadmin . 
$ ls 
manage.py  myadmin  venv

Criando uma aplicação para o projeto

$ python manage.py startapp core

Gosto de move a aplicação para dentro da pasta do projeto

$ mv core/ myadmin/

Agora vamos adicionar nossa aplicação no settings.py do nosso projeto, em INSTALLED_APPS adicione ‘myadmin.core’,

# Application definition

INSTALLED_APPS = [
    'django.contrib.admin',
    'django.contrib.auth',
    'django.contrib.contenttypes',
    'django.contrib.sessions',
    'django.contrib.messages',
    'django.contrib.staticfiles',

    # My App
    'myadmin.core',
]

Vamos criar um simples modelo para utilizarmos de teste. No models.py da nossa app core deixe igual abaixo.

from django.db import models

class Artigo(models.Model):
    titulo = models.CharField('Título', max_length=200)
    texto = models.TextField('Artigo')
    data_publicacao = models.DateTimeField(blank=True,null=True)

    def __str__(self):
        return self.titulo

Agora abra o admin.py e vamos registrar o nosso modelo para que o admin do djago gerencie

from django.contrib import admin

from .models import Artigo

admin.site.register(Artigo)

Hora de criar os migrations e fazer a migração dos modelos para o banco

$ ./manage.py makemigrations

Migrations for 'core':

myadmin/core/migrations/0001_initial.py

- Create model Artigo
$ ./manage.py migrate

Operations to perform:

Apply all migrations: admin, auth, contenttypes, core, sessions

Running migrations:

Applying contenttypes.0001_initial... OK

Applying auth.0001_initial... OK

Applying admin.0001_initial... OK

Applying admin.0002_logentry_remove_auto_add... OK

Applying admin.0003_logentry_add_action_flag_choices... OK

Applying contenttypes.0002_remove_content_type_name... OK

Applying auth.0002_alter_permission_name_max_length... OK

Applying auth.0003_alter_user_email_max_length... OK

Applying auth.0004_alter_user_username_opts... OK

Applying auth.0005_alter_user_last_login_null... OK

Applying auth.0006_require_contenttypes_0002... OK

Applying auth.0007_alter_validators_add_error_messages... OK

Applying auth.0008_alter_user_username_max_length... OK

Applying auth.0009_alter_user_last_name_max_length... OK

Applying core.0001_initial... OK

Applying sessions.0001_initial... OK

Vamos criar um superusuário inicial
 

$ ./manage.py createsuperuser

Username (leave blank to use 'william'): admin

Email address: admin@admin.com

Password:

Password (again):

Superuser created successfully.

Vamos rodar o projeto e ver se está tudo certo
 

$ ./manage.py runserver

Performing system checks...


System check identified no issues (0 silenced).

August 07, 2018 - 14:24:07

Django version 2.1, using settings 'myadmin.settings'

Starting development server at http://127.0.0.1:8000/

Quit the server with CONTROL-C.

Abra o navegador no endereço http://127.0.0.1:8000/admin/

Coloque seu nome de usuário e senha e crie um artigo de teste, deixe a data de publicação em branco.

Sua list view deve estar semelhante a isto

Vamos melhorar um pouco esta apresentação, abra o admin.py da nossa aplicação core e vamos criar um classe admin que altera esta apresentação um pouco.

Faça alterações para ela ficar parecida com o admin.py abaixo.

from django.contrib import admin

from .models import Artigo


class ArtigoAdmin(admin.ModelAdmin):
    list_display = ['titulo', 'texto', 'data_publicacao',]

admin.site.register(Artigo, ArtigoAdmin)

Como podemos ver já melhorou um pouco

Agora vamos criar um action que publica os artigos selecionados

Volte ao admin.py e adicione a seguinte linha abaixo da linha list_display, actions = [publicar,] deixando a classe ArtigoAdmin igual a baixo

class ArtigoAdmin(admin.ModelAdmin):
    list_display = ['titulo', 'texto', 'data_publicacao',]
    actions = [publicar,]

O que nos estamos fazendo é criar um opção no menu actions que chama uma função chamada publicar, então vamos criar esta função. Acima da classe ArtigoAdmin crie o seguinte código.

def publicar(modelAdmin, request, queryset):
    for artigo in queryset:
        artigo.data_publicacao = timezone.now()
        artigo.save()

No começo do arquivo foi adicionado o import do timezone
 

from django.utils import timezone

No final nosso arquivo admin.py ficou assim

from django.contrib import admin
from django.utils import timezone

from .models import Artigo


def publicar(modelAdmin, request, queryset):
    for artigo in queryset:
        artigo.data_publicacao = timezone.now()
        artigo.save()


class ArtigoAdmin(admin.ModelAdmin):
    list_display = ['titulo', 'texto', 'data_publicacao',]
    actions = [publicar,]

admin.site.register(Artigo, ArtigoAdmin)

Agora teste que nossa action já está funcionando corretamente.

Como pode ver é muito simples alterar este exemplo para fazer outras ações, como aplicar desconto ou chamar uma função de envio de e-mail, etc.

Este exemplo está disponível no meu github para caso você queira consultar https://github.com/williamdepaula/djangoactionlist

 

Referências

https://simpleisbetterthancomplex.com/tutorial/2017/03/14/how-to-create-django-admin-list-actions.html

 

Sobre o Dicas TI

Somente mais um site sobre internet, tecnologia, desenvolvimento e programação. Uma forma de, tentar, devolver o que aprendi na internet através de pesquisas e estudos. E como falou o pensador Joseph Joubert “Ensinar é aprender duas vezes” mas não se engane aqui você encontrara somente um leve rascunho uma tentativa de ensino e nada mais.