1
resposta

Busca por Categoria

Percebi que o django admin trata Sopa e sopa de forma diferente, teria alguma forma de tratar esses dados pra quando colocar "sopa", ou "SoPa" seja interpretado da mesma forma?

1 resposta

Olá Weverton, tudo bem com você?

Peço desculpas pela demora em lhe responder.

Para que as palavras sopa e SoPa sejam reconhecidas no filtro por categoria (list_filter) como uma única palavra será necessário criarmos uma classe que será responsável por coletar os nomes das categorias, e usando a função Lower do Django criarmos uma nova lista com as categorias em minúsculo, assim no filtro não haverá duplicidade de categorias devido o uso de letras maiúsculas ou minúsculas em uma determinada palavras.

Os métodos lookups e queryset presente na classe CategoriaCaseInsensitive irão substituir momentaneamente os métodos de busca padrão do Django, recebendo assim novas lógicas de busca e de apresentação de resultados.

No arquivo receitas/admin.py iremos adicionar nossa nova classe. Sendo declarada da seguinte forma.

from django.db.models.functions import Lower
from django.contrib.admin import SimpleListFilter


class CategoriaCaseInsensitive(SimpleListFilter):
    title = 'categoria'
    parameter_name = 'categoria'

    def lookups(self, request, model_admin):
        qs = model_admin.model.objects.all()
        resultado = [i for i in qs.values_list('categoria').annotate(handle_lower=Lower("categoria")).distinct("handle_lower")] 

        return resultado

    def queryset(self, request, queryset):
        if self.value():
            return queryset.filter(categoria__icontains=self.value())

A classe CategoriaCaseInsensitive será usada como parâmetro para o filtro list_filter da classe ListandoReceitas, como declarado abaixo.

list_filter = (CategoriaCaseInsensitive,)

Nesse momento, o filtro por categoria do Django Admin, irá apresentar todas as categorias escritas em minúsculo, evitando a duplicidade.

Início da transcrição. GIF Contendo a apresentação do código apresentado anterior a esse GIF, o usuário apresenta o código transcrito no editor de texto VsCode, após mostrar o código o usuário abre o painel administrador do django, o painel está aberto na página de edição de receitas, nessa página temos exibido a tabela de receitas apresentado dez receitas de um total de doze receitas, nessa tabela temos a terceira coluna contando da esquerda para a direita a coluna de Categorias, nesta coluna temos três tipos, sendo pão, sobremesa e sopa, a categoria sopa foi escrita de três forma diferentes, sendo SoPa, Sopa e SoPa, o usuário destaca essa diferença no cadastro das receitas passando o mouse acima delas, logo após, o usuário destaca o filtro por categoria a direita da tela, destacando que foi realizado o filtro apresentando apenas sopa, não ocorrendo duplicidade, nesse momento o usuário clica no filtro de nome sopa, a página é atualizada e apresenta três resultados, sendo as receitas pertencentes a categoria sopa. O GIF reinicia em loop infinito. Final da transcrição.

Caso queira conhecer um pouco mais sobre a criação de filtros personalizados, deixo abaixo um link de referência para a documentação onde é explicado com detalhes sobre como realizar a criação dos filtros. A documentação está em inglês, caso tenha dificuldade com o idioma, recomendo o uso do tradutor do navegador.

Fico à disposição em caso de dúvidas.

Abraços e bons estudos.

Caso este post tenha lhe ajudado, por favor, marcar como solucionado ✓. Bons Estudos!

Quer mergulhar em tecnologia e aprendizagem?

Receba a newsletter que o nosso CEO escreve pessoalmente, com insights do mercado de trabalho, ciência e desenvolvimento de software