1
resposta

[Sugestão] A forma que eu fiz, está certo?

Boa noite! Sendo bem sincero, não entendi muito bem o código feito na função buscar do arquivo receitas.views.

def buscar(request):
    lista_receitas = Receita.objects.order_by('-data').filter(publicada=True)

        # fazendo a verificação nos parâmetros do url
    if 'buscar' in request.GET:
        nome_a_buscar = request.GET['buscar']
        if buscar:
            lista_receitas = lista_receitas.filter(nome__icontains=nome_a_buscar)

    dados = {
        'receitas': lista_receitas
    }

    return render(request, 'buscar.html', dados)

Por esse motivo, resolvi escrever de uma forma que eu entendesse o que estava fazendo. Gostaria de saber se também está correto.

def buscar(request):
    lista_receitas = Receitas.objects.order_by('-data').filter(publicada=True)

    if request.GET['search']:
        nome_a_buscar = request.GET['search']
        lista_receitas = lista_receitas.filter(nome__icontains=nome_a_buscar)
    else:
        lista_receitas = []
    dados = {
        'receitas': lista_receitas
    }
    return render(request, 'buscar.html', dados)
1 resposta

Olá Miguel,

Não está, ao acessar o 'buscar.html' sem o atributo 'buscar' ('search' no seu caso) ou sendo uma string vazia a listagem retornada está em branco, acredito que este não seja o comportamento esperado. Mas vou explicar linha a linha para você entender:

if 'buscar' in request.GET:

Ele identifica se existe, primeiramente, o atributo 'buscar' na requisição:

nome_a_buscar = request.GET['buscar']

Atribui o valor do atributo a variável nome_a_buscar

if nome_a_buscar:

Ele só vai executar o filtro se a string não for vazia

lista_receitas = lista_receitas.filter(nome__icontains=nome_a_buscar)

verifica na listagem os itens cujo o nome contêm a substring passada

dados = {
        'receitas': lista_receitas
    }

    return render(request, 'buscar.html', dados)

Envia os dados com a listagem de receitas completa caso não tenha o atributo buscar na requisição ou o atributo seja uma string vazia, senao envia a listagem filtrada.

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