2
respostas

split de string via template

Como eu faço pra tratar string na hora de exibir na view? quero dar um split numa string vinda do banco... recebo o nome completo de um usuário mas quero dar um split pra exibir apenas o primeiro nome e quando passar o cursor em cima via hover seja exibido o nome completo. por exemplo, ao receber a data eu uso um filtro pra exibir apenas dia e mês, e quanto tempo até agora (primeira célula no código).. e como faço pra exibir apenas uma parte do nome do usuário? existe algum filtro ja do django ou preciso criar o meu próprio filtro (que foi apenas o que achei na net) ?

meu código:

<tr>
                <td>{{ detalhe_chamado.data|date:'d/m' }}
                    {{ detalhe_chamado.data|timesince }}
                </td>
                <td>{{ detalhe_chamado.numero_chamado }}</td>
                <td>{{ detalhe_chamado.titulo }}</td>
                <td>{{ detalhe_chamado.descricao }}</td>
                <td>{{ detalhe_chamado.categoria }}</td>
                <td>{{ detalhe_chamado.fila }}</td>                
                <td>{{ detalhe_chamado.prioridade }}</td>
                <td>{{ detalhe_chamado.usuario }}</td>
                <td>{{ detalhe_chamado.patrimonio }}</td>
                <td>{{ detalhe_chamado.ip }}</td>
            </tr>
2 respostas

Caso precisem fazer algo parecido mas necessariamente criando um filtro próprio, como foi o meu caso até o momento, pesquisei na net e fiz assim:

É necessário criar um diretório "templatetags" no mesmo nível de templates.py e views.py e criar um arquivo init.py e um arquivo para as tags personalizadas, no meu caso chamei de "tags.py".

Meu arquivo tags.py ficou assim:

from django import template

register = template.Library()

@register.filter
def palavras(string, quantidade):
    resultado = ""
    for contagem in range(int(quantidade)):
        resultado += str(string).split()[contagem]+" "

    return str(resultado)

No template onde vai ser utilizado seu filtro deve ser carregado o arquivo de tags no início do arquivo:

................
{% load static  %}
{% load tags %} #nome do arquivo criado dentro de templatetags
{% block content %}
....................

para usar o filtro, basta colocar o | com o nome do filtro seguido de : e a quantidade de palavras a ser exibida. No meu caso ficou assim:

........................
<td>{{ detalhe_chamado.usuario|palavras:2 }}</td>
........................

SEMPRE que alterar as tags/filters é necessário reiniciar o servidor.

Oii Arnóbio, como você está?

Peço desculpas pela demora em obter um retorno.

Gostaria de parabenizá-lo pela proatividade em buscar insumos para resolução do seu problema, que inclusive, ficou bem interessante. Se me permite, deixo até como sugestão uma validação para o número de palavras buscadas, pois, caso tenha alguma palavra que seja menor do que dois, será levantado o erro: IndexError: list index out of range.

Quanto ao problema específico do filtro de split, a forma que você realizou utilizando filtros personalizados é uma solução, porém, é possível fazer algo similar utilizando a sintaxe Python dentro da própria tag de template do Django, como mostro abaixo:

<h5>{{ receita.nome_receita.split.0}}</h5>

No código acima o atributo split será responsável por separar as palavras por espaço - isto é um padrão do template do próprio Django, logo após informamos que queremos o valor do primeiro índice, neste caso, o primeiro nome. Caso quisessemos que o sobrenome fosse apresentado, bastaria utilizar o índice 1, no lugar do índice 0. Caso opte por realizar a separação com base em outra referência de separação, será necessário realizar a criação de um filtro personalizado, como realizado por você.

Qualquer dúvida fico à disposição.

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