3
respostas

Atributos privados e Exibição

Pessoal,

estou tentando exibir alguns dados no html e não consigo. Acredito ser por conta dos parâmetros serem privados. Falo isso porque quando utilizei os valor na classe com os atributos públicos, funcionou. Seguem abaixo os códigos:

class Aluno:

    def __init__( self, rm, nome, sexo ): #data_de_nascimento, cor, local_nascimento, nacionalidade, rg, cpf ):
        self.__rm = rm
        self.__nome = nome
        self.__sexo = sexo

        @property
        def rm(self):
            return self.__rm

        @property
        def nome(self):
            return self.__nome

        @property
        def sexo(self):
            return self.__sexo
from flask import Flask, render_template, request, redirect
from alunos import Aluno

app = Flask(__name__)

aluno1 = Aluno("1", 'Felipe', 'M')
lista = [aluno1]


@app.route("/")
def index():
    return render_template("lista.html", titulo="Alunos", alunos=lista)


@app.route("/novo")
def novo():
    return render_template("novo.html", titulo="Novo Aluno")


@app.route('/criar', methods=['POST', ])
def criar():
    rm = request.form["rm"]
    nome = request.form["nome"]
    sexo = request.form["sexo"]
    aluno = Aluno(rm, nome, sexo)
    lista.append(aluno)
    return redirect("/")


app.run(debug=True)

Também seguem os templates que estou utilizando:

{% extends "template.html" %}
{% block content %}
    <table class="table table-striped table-responsive table-bordered">
        <thead class="thead-default">
            <tr>
                <th>RM</th>
                <th>Nome</th>
                <th>Sexo</th>
            </tr>
        </thead>
        <tbody>
            {% for aluno in alunos %}
            <tr>
                <td>{{ aluno.rm }}</td>
                <td>{{ aluno.nome}}</td>
                <td>{{ aluno.sexo }}</td>
            </tr>
            {% endfor %}
        </tbody>
    </table>
{% endblock %}
{% extends "template.html" %}
{% block content %}
  <form action="/criar" method="post">
      <fieldset>
          <div class="form-group">
              <label for="rm">RM</label>
              <input type="text" id="rm" name="rm" class="form-control">
          </div>
          <div class="form-group">
              <label for="nome">Nome</label>
              <input type="text" id="nome" name="nome" class="form-control">
          </div>
          <div class="form-group">
              <label for="sexo">Sexo</label>
              <input type="text" id="sexo" name="sexo" class="form-control">
          </div>
          <button type="submit" class="btn btn-primary btn-salvar">Salvar</button>
      </fieldset>
  </form>
{% endblock %}

Podem me ajudar, por favor?

3 respostas

vc ja tentou usar aluno._Aluno__rm, por exemplo ?


Não é o ideal, mas para ter certeza que o problema tá no fato na variavel ser private. Na verdade, a variavel private no python tem como ser acessada da seguinte forma _NomeDaClasse__nomeDoAtributo. Você pode usar também a variavel protegida, no lugar da private.


exemplo:


class employee:
    def __init__(self, name, sal):
        self._name=name  # protected attribute 
        self._salary=sal # protected attribute

Raissa, funcionou chamando no html dessa forma, realmente ainda não tinha testado! Porém, dessa forma ainda chamo no código, de forma explicita. Gostaria de saber se é possível passar o atributo no html de outra forma. Sabe me dizer? De qualquer forma, obrigado pela ajuda

Alguém seria ideia?