Ir ao conteúdo
  • Cadastre-se

Python Comparar dois valores de dois for em um if no Django


Posts recomendados

Preciso comparar dois valores de dois models diferente(Funcionario e Participacao) e retornar 2 valores, uma delas sendo de uma terceira tabela(Bloco).

Models.py

    class Funcionario(models.Model):
        nome = models.CharField(max_length=45, null=True)
        CPF = models.CharField(max_length=14, default=0)
    
    
        def __str__(self):
            return self.nome
    
    
    class Bloco(models.Model):
        tipo = models.IntegerField(default=0)
        responsavel = models.CharField(max_length=255, null=True)
    
    
    class Participacao(models.Model):
        Funcionario_id = models.ForeignKey(Funcionario, related_name='Funcionarios', on_delete=models.PROTECT, null=True)
        Bloco_id = models.ForeignKey(Bloco, related_name='blocos', on_delete=models.PROTECT, null=True)
        quantDias = models.IntegerField(default=0)
        
        def __str__(self):
            return str(self.Funcionario_id)

views.py

 

   class ListaFuncionario(ListView):
        model = Funcionario
        context_object_name = 'Funcionarios'
        template_name = 'lista_Funcionarios.html'
    
        def get_context_data(self, *, object_list=None, **kwargs):
            context = super(ListaFuncionario, self).get_context_data(**kwargs)
            context['participacoes'] = Participacao.objects.all()
            context['blocos'] = Bloco.objects.all()
            return context

templates

      <table class="table">
        <thead class="thead-dark">
        <tr>
          <th>Nome</th>
          <th>Alterar</th>
        </tr>
        </thead>

        <tbody>

        {% for funcionario in funcionarios %}
        <tr>
          <td>{{ funcionario.nome }}</td>
            <!-- Button Ver/Alterara Lotação -->
          </td>
            <div class="btn-group mr-2" role="group" aria-label="First group">

              {% for participacao in participacoes %}
                {% if participacao.Funcionario_id == funcionario.nome %}
                  <a href="#" class="btn btn-secondary">{{ participacao.pk }}</a>
                {% endif %}
              {% endfor %}

            </div>
          </td>
        </tr>
        {% endfor %}

        </tbody>
      </table>

O que estou tentando fazer é verificar quantas vezes o "id" de um funcionario(da tabela funcionario) aparece na tabela "participacao"(Participacao.Funcionario_id), e pra cada vez que aparecer irá "renderizar um botão que irá levar para outra página onde o usuário poderá alterar as informações que correspondem a aquele ID.

Ambos as váriaveis no "if"(participacao.Funcionario_id e funcionario.nome) retornam string, já testei no cmd e coloquei print no template para ver o output, ambos retornam o "nome",

porém mesmo ambos os nomes sendo iguais, ele sempre retorna falso e percorre todo o for.

 

Link para o comentário
Compartilhar em outros sites

Não sei como voce está validando o seu cadastro, mas no template, ao invés de colocar(igualment) ==, eu coloquei (se diferente) !=, e renderizou dois links como se vê abaixo.

Não apareceu botão porque não carreguei o bootstrap, mas o problema está na lógica de como voce está tratando os dados na sua view

image.png.3887c9aba33db125795f3101c3d3ca2f.png

Observe que eu mudei aqui na sua view poucas linhas para poder renderizar o template

image.thumb.png.fe9ea6e47147ef0c7b6130032adc9649.png

Não sei porque mas voce não estava carregando os Funcionários no contexto, mas estava instanciando ele no template({% for funcionario in funcionarios %}) veja:

 

image.png.9217210f0625a9fd5b94d29d2c7a77b4.png

 

A única coisa que mudei foi sua condicional if

image.png.e4416bec81f4d3c092b3d732b8283428.png

 

Então o que voce viu na tela lá no topo de fato eram os "botões" com as PrimaryKey solicitadas.

 

Fora isso não faço mais ideia do que o seu projeto quer fazer e para quais apps ela vai apontar.

 

Espero que isso tenha te dado alguma uma luz do problema!👍

Link para o comentário
Compartilhar em outros sites

@fspjonny Também tentei isso, e acho que o que você fez resultou no mesmo que a minha tentativa.

O que estou tentando fazer é o seguinte. 

Tenho duas models. "Model1" e "Model2".

A model1 é FK na model2... e como o nome sugere, ela pode aparecer mais de uma vez na model2.

Quando eu uso o tratamento "!=" ele renderiza todas as ID da "Model2", que no meu caso são 10, no seu aparente ser apenas 2.

O que preciso fazer é para cada ID da Model1 que tem na Model2 renderizar um botão na lista.

Ex:

Model 1
ID = 1 | Nome = Funcionario 1
ID = 2 | Nome = Funcionario 2

Model 2
ID = 1 | FK_MODEL1 = 1
ID = 2 | FK_MODEL1 = 2
ID = 3 | FK_MODEL1 = 1
ID = 4 | FK_MODEL1 = 1
ID = 5 | FK_MODEL1 = 2
ID = 6 | FK_MODEL1 = 1
ID = 7 | FK_MODEL1 = 2


Digamos que a tabela está populada assim.
Na página irá ter uma lista de usuários e para cada usuário vai renderizar o botão de acordo com a model 2.

Lista de Usuários

Nome                Dados            Botão que irá renderizar
Funcionario 1       Vendedor            Botão1(ID1)|Botão2(ID3)|Botão3(ID4)|Botão4(ID6)
Funcionario 2        Caixa            Botão1(ID2)|Botão2(ID5)|Botão3(ID7)

Conseguiu entender?

Link para o comentário
Compartilhar em outros sites

1 hora atrás, Anonn disse:

@fspjonny Também tentei isso, e acho que o que você fez resultou no mesmo que a minha tentativa.

O que estou tentando fazer é o seguinte. 

Tenho duas models. "Model1" e "Model2".

A model1 é FK na model2... e como o nome sugere, ela pode aparecer mais de uma vez na model2.

Quando eu uso o tratamento "!=" ele renderiza todas as ID da "Model2", que no meu caso são 10, no seu aparente ser apenas 2.

O que preciso fazer é para cada ID da Model1 que tem na Model2 renderizar um botão na lista.

Ex:

Model 1
ID = 1 | Nome = Funcionario 1
ID = 2 | Nome = Funcionario 2

Model 2
ID = 1 | FK_MODEL1 = 1
ID = 2 | FK_MODEL1 = 2
ID = 3 | FK_MODEL1 = 1
ID = 4 | FK_MODEL1 = 1
ID = 5 | FK_MODEL1 = 2
ID = 6 | FK_MODEL1 = 1
ID = 7 | FK_MODEL1 = 2


Digamos que a tabela está populada assim.
Na página irá ter uma lista de usuários e para cada usuário vai renderizar o botão de acordo com a model 2.

Lista de Usuários

Nome                Dados            Botão que irá renderizar
Funcionario 1       Vendedor            Botão1(ID1)|Botão2(ID3)|Botão3(ID4)|Botão4(ID6)
Funcionario 2        Caixa            Botão1(ID2)|Botão2(ID5)|Botão3(ID7)

Conseguiu entender?

Entendi sim, vou dar uma olhada mais tarde, e sobre o meu resultado, eu só populei a tabela com 2 registros por isso dois botões apenas, mas vou colocar mais dados aleatórios lá e fazer os testes depois.👍

Link para o comentário
Compartilhar em outros sites

Boa tarde!

Eu não consegui chegar no seu objetivo, talvez eu não tenha entendido a sua explicação direito, porque eu procuro e mando verificar em Participacao.Funcionario_id, quantas vezes tem Funcionario.nome e com isso gerar os botões de acordo com essa quantidade para cada um dos funcionarios cadastrados, correto?

 

Mas acontece que na comparação de Participacao.Funcionario_id, me é retornado um vazio lá no template e por isso ele não acha que é igual, mas sim diferente a Funcionario.nome.

 

veja que abaixo eu cadastrei mais funcionários

image.png.083cf39a2bf2c8404441b3df1c45c3ae.png

E o resultado no template(funcionario_list.html), foi o mesmo do anterior

image.png.6113f7eec3c2605346bf562deeb9ecbc.png

e 12 botões, que se referem a cada PK gerada ao cadastrar funcionários em várias participações.

image.png.30dd209bdd46738ee36969789f93c479.png

Por isso eu não entendi mesmo o que ocorre no seu programa, ou o que deveria ocorrer.

 

Você pode bater um papo com esses caras aqui https://groups.google.com/forum/#!forum/django-brasil

Pode ser que lá alguém saiba algo mais sobre esse assunto e eles são especializados em Django.

 

Mas se quiser continuar tentando comigo, me passa exatamente como está a estrutura do seu projeto, para que eu tenha uma melhor visão do que ocorre.

 

Link para o comentário
Compartilhar em outros sites

Crie uma conta ou entre para comentar

Você precisa ser um usuário para fazer um comentário

Criar uma conta

Crie uma nova conta em nossa comunidade. É fácil!

Crie uma nova conta

Entrar

Já tem uma conta? Faça o login.

Entrar agora

Sobre o Clube do Hardware

No ar desde 1996, o Clube do Hardware é uma das maiores, mais antigas e mais respeitadas comunidades sobre tecnologia do Brasil. Leia mais

Direitos autorais

Não permitimos a cópia ou reprodução do conteúdo do nosso site, fórum, newsletters e redes sociais, mesmo citando-se a fonte. Leia mais

×
×
  • Criar novo...

 

GRÁTIS: ebook Redes Wi-Fi – 2ª Edição

EBOOK GRÁTIS!

CLIQUE AQUI E BAIXE AGORA MESMO!