Solucionado (ver solução)
Solucionado
(ver solução)
2
respostas

[Dúvida] Erro ao usar a função render em uma visualização Django - variável não reconhecida

Olá, estou enfrentando um problema ao tentar usar a função render() em uma visualização no meu projeto Django. Ao tentar passar uma variável para o template usando o dicionário de contexto, a variável não está sendo reconhecida no template. Aqui está o trecho de código da minha visualização, views.py:

def sua_view(request):
    teste = 2
    return render(request, 'comparar_bpmn_tramite.html', {'teste': teste})

No meu template 'comparar_bpmn_tramite.html', estou tentando acessar a variável {{ teste }}, mas não está funcionando como esperado. Já verifiquei se importei corretamente a função render e também certifiquei-me de que a rota para esta visualização está configurada corretamente. Alguém poderia me dar alguma orientação sobre o que posso estar fazendo de errado? Agradeço antecipadamente pela ajuda!

Código no comparar_bpmn_tramite.html:

{% extends "plugin_leitura/_layouts/base.html" %}

{% load static %} 

{% load crispy_forms_tags %}

{% load widget_tweaks %}

{% block title %}Comparar BPMN a Trâmites{% endblock %}

{% block conteudo %} 
    <div class="box">
        <h1>Processo BPMN: {{ processo_bpmn.nome }}</h1>    
        <form method="POST" class="d-flex flex-column"> 
            {% csrf_token %}
            <label for="processo-paginado">Selecione o processo paginado para ser comparado:</label>
            <select name="processo_paginado" id="processo-paginado" class="form-control">
                {% for processo_paginado in processos_paginados %}
                    <option value="{{processo_paginado}}">{{processo_paginado}}</option>
                {% endfor %}
            </select>
            <button class="btn btn-success">Enviar</button>
        </form> 

        <div class="mt-5">
            <table id="example" class="table table-striped table-bordered" style="width:100%">
                <thead>
                    <tr>
                        <th>Atores do Processo BPMN</th>
                        <th>Setores do processo escolhido</th>
                        <th>Quantidade de atores iguais</th>
                        <th>Equivalência entre setores e atores BPMN</th>
                        <th>Porcentagem de equivalência</th>
                        <th>Equivalência de ordens de execução</th>
                    </tr>
                </thead>
                <tbody>
                    <tr>
                        <td>
                            {% for atores_bpmn in results.atores_processo_bpmn %}
                                {{ atores_bpmn }}
                                <br>
                            {% endfor %}
                        </td>

                        <td>
                            {% for setor in results.setores_tramites_processo_paginado %}
                                {{ setor }}
                                <br>
                            {% endfor %}
                        </td>
                        <td>{{ results.atores_iguais }}</td>
                        <td>
                            {% for ator_equivalente_setor in results.atores_equivalentes %}
                                {{ ator_equivalente_setor.setor }} - 
                                {% for ator in ator_equivalente_setor.ator.all %}
                                    {{ ator }},
                                {% endfor %}
                                <br>
                            {% endfor %}
                        </td>
                        <td>
                            {{ results.porcentagem_equivalencia }}
                        </td>
                        <td>
                            {% if equivalencia_ordens_de_execucao %}
                                <span>O trâmite corresponde a alguma ordem do processo</span>
                            {% else %}
                                <span>O trâmite NÃO corresponde a alguma ordem do processo</span>
                            {% endif %}
                        </td>
                    </tr>
                </tbody>
            </table>
        </div>

        <!-- Nova tabela -->
        <div class="mt-5">
            <table class="table table-striped table-bordered" style="width:100%">
                <thead>
                    <tr>
                        <th>Teste</th>
                    </tr>
                </thead>
                <tbody>
                    <tr>
                        <td>{{ teste }}</td>                         
                    </tr>
                </tbody>
            </table>
        </div>
        <!-- Fim da nova tabela -->
    </div>
{% endblock %}
2 respostas
solução!

Olá, Pedro!

Pelo que você descreveu, parece que está fazendo tudo corretamente ao passar a variável para o template através do dicionário de contexto na função render(). No entanto, com base no código do template que você compartilhou, parece que a variável teste está sendo usada num bloco {% block conteudo %}.

Os blocos em templates Django têm um escopo próprio, o que significa que as variáveis definidas fora deles não são acessíveis dentro deles, a menos que sejam explicitamente passadas.

Como você está tentando acessar {{ teste }} dentro do bloco {% block conteudo %}, é possível que a variável não esteja sendo reconhecida por esse motivo. Para resolver isso, você pode tentar passar a variável teste para o bloco {% block conteudo %} da seguinte maneira:

{% block conteudo %}
    {% with teste as teste %}
        ...
        <div class="mt-5">
            <table class="table table-striped table-bordered" style="width:100%">
                <thead>
                    <tr>
                        <th>Teste</th>
                    </tr>
                </thead>
                <tbody>
                    <tr>
                        <td>{{ teste }}</td>                         
                    </tr>
                </tbody>
            </table>
        </div>
        ...
    {% endwith %}
{% endblock %}

O uso do {% with %} cria um novo contexto que é acessível dentro do bloco, permitindo que você use a variável teste como esperado.

Espero ter ajudado. Caso tenha mais dúvidas ou problemas, estarei à disposição para ajudá-lo.

Grande abraço e bons estudos!

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

Obrigado pela ajuda