[Python] Filltragem refinada em django

Discussão em 'Python' iniciado por Stack, Novembro 24, 2024.

  1. Stack

    Stack Membro Participativo

    Boa noite, gostaria de saber, como em django, eu posso criar uma filtragem refinada, numa lista de itens exibidos ao usuario, seria algo como ( filtro 1 aplicado, retorna resultado, ai aplica filtro2, e retorna o resultado dentro dos elementos retornados nop filtro 1, por exemplo de uma lista de cadastros, entre homens e mulheres, casados e solteiros com e sem filhos,, selecionar somente os homens e casados e sem filhos,) acho que deu para entender segue abaixo a minha view para listar e o template que renderiza essa pagina

    `class listarprocessos(ListView): model = models.Processo template_name = 'processos/processo.html' context_object_name = 'processos' paginate_by = 10

    #combinar as duas formas de busca, uma para busca, e outra para ordenaçao def get_queryset(self): #aqui para a search queryset = models.Processo.objects.filter(show=True).order_by('-id') search_query = self.request.GET.get('q', '') if search_query: queryset = queryset.filter( Q(numero_processo__icontains=search_query) | Q(numero_licitacao__icontains=search_query) | Q(contratante__icontains=search_query) | Q(modalidade__icontains=search_query) ).order_by('-id') # ordena do maior para o menor, atençao quando lançar a logica no template, o eroo # era Seu template usava -data_disputa, mas o backend esperava data_disputa_asc. sort_param = self.request.GET.get('sort', '')# self.request captura as informaçoes do template

    if sort_param =='data_disputa':
    queryset = queryset.order_by('-data_disputa')
    elif sort_param =='data_disputa_asc':
    queryset = queryset.order_by('data_disputa')

    #filtro por categoria do models
    modalidade=self.request.GET.get('modalidade', '')
    status = self.request.GET.get('status', '')
    tipo=self.request.GET.get('tipo', '')
    # para consultas dinamicas ,e refinadas somente if

    if modalidade:
    queryset = queryset.filter(modalidade=modalidade)
    if status:
    queryset = queryset.filter(status=status)
    if tipo:
    queryset = queryset.filter(tipo=tipo)
    # else:
    # return redirect('processos:processo')
    return queryset

    tem que fazer os 2 context, e get query set


    def get_context_data(self, **kwargs):
    context = super().get_context_data(**kwargs)

    # Obter as modalidades disponíveis dinamicamente
    context['modalidades'] = models.Processo.objects.values_list('modalidade', flat=True).distinct()
    context['situacao'] = models.Processo.objects.values_list('status', flat=True).distinct()
    context['tipos'] = models.Processo.objects.values_list('tipo', flat=True).distinct()

    return context


    template abaixo {% extends "global/base.html" %} {% block content_processos %}

    {% load alfilters %}

    {% block searchprocesso %}

    <form action="{% url 'processos:processo' %}" method="get">
    <input
    type="text"
    class="search-input"
    placeholder="SEARCH"
    name="q"
    id="search"
    value="{{ request.GET.q }}"
    style="background: slategray"

    >
    </form>


    {% endblock %} COMERCIAL

    PROCESSOS

    Id do Processo Nº Processo Nº licitação Contratante Modalidade
    <option value="" {% if not request.GET.modalidade %}selected{% endif %}>
    SELECIONE
    </option>

    {% for modalidade in modalidades %}

    <option value="{{ modalidade }}" {% if request.GET.modalidade == modalidade %}selected {% endif %}>
    {{modalidade}}
    </option>
    {% endfor %}

    </select>

    </form>
    </th>



    <th class="table-header" style="text-align: center">
    <a href="?q={{ request.GET.q }}&sort={% if request.GET.sort == 'data_disputa' %}data_disputa_asc{% elif request.GET.sort == 'data_disputa_asc' %}data_disputa{% else %}data_disputa{% endif %}">
    Data da Seção
    {% if request.GET.sort == 'data_disputa' %}
    <span>&#9650;</span> <!-- Ícone de ordenação crescente -->
    {% elif request.GET.sort == 'data_disputa_asc' %}
    <span>&#9660;</span> <!-- Ícone de ordenação decrescente -->
    {% else %}
    <span>&#9651;</span> <!-- Ícone neutro quando sem ordenação -->
    {% endif %}
    </a>
    </th>


    <th class="table-header" style="text-align: center">
    TIPO
    <form action="{% url 'processos:processo' %}" method="get" >
    <select name="tipo" onchange="this.form.submit()" id="">

    <option value="" {% if not request.GET.tipo %}selected{% endif %}>
    SELECIONE
    </option>

    {% for tipo in tipos %}
    <option value="{{ tipo}}" {% if request.GET.tipo == tipo %}selected{% endif %}>
    {{tipo}}
    </option>
    {% endfor %}

    </select>

    </form>
    </th>


    <th class="table-header" style="text-align: center">Valor total</th>




    <th class="table-header" style="text-align: center">
    status
    <form action="{% url 'processos:processo' %}" method="get" >
    <select name="status" onchange="this.form.submit()" id="">

    <option value="" {% if not request.GET.status %}selected{% endif %}>
    SELECIONE
    </option>

    {% for status in situacao %}
    <option value="{{ status}}" {% if request.GET.status == status %}selected{% endif %}>
    {{status}}
    </option>
    {% endfor %}

    </select>

    </form>
    </th>


    </tr>
    </thead>
    <tbody>

    </tbody>
    {% for processo in processos %}
    <tr class="table-row">
    <td class="table-cel" style="text-align: center">
    <a href="{% url 'processos:detalhe' processo.pk %}">
    {{ processo.pk }}
    </a>
    </td>
    <td class="table-cel" style="text-align: center">{{processo.numero_processo}}</td>

    <td class="table-cel" style="text-align: center">{{processo.numero_licitacao}}</td>
    <td class="table-cel" style="text-align: center">{{processo.contratante}}</td>
    <td class="table-cel" style="text-align: center">{{processo.modalidade}}</td>
    <td class="table-cel" style="text-align: center">{{processo.data_disputa}}</td>
    <td class="table-cel" style="text-align: center">{{processo.tipo}}</td>
    <td class="table-cel" style="text-align: center">{{processo.valor_total|formata_preco}}</td>
    <td class="table-cel" style="text-align: center">{{processo.status}}</td>
    </tr>

    {% endfor %}

    </table>


    <div>


    </div>


    {% endblock %}

    `

    Continue reading...

Compartilhe esta Página