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

Renderizar HTML

Boa tarde,

Gostaria de saber se é possível renderizar o conteúdo da pagina HTML com o uso de @property ao invés de acessar diretamente os atributos do objeto perfil. Se sim como?

4 respostas

Jose, cola o código atual que você quer usar o @property. Me ajuda pois estou longe do computador. Pode ser?

Flavio,

Por exemplo, neste urls.py

from django.conf.urls import url
from perfis import views

urlpatterns = [
    url(r'^$', views.index, name='home'),
    url(r'^perfis/(?P<perfil_id>\d+$)', views.exibir, name='exibir'),
    url(r'^perfis_todos$', views.todos, name='todos'),
]

arquivo views.py

from django.shortcuts import render
from perfis.models import Perfil


# Create your views here.
def index(request):
    return render(request, 'index.html')


def todos(request):
    return render(request, 'perfis.html', {'perfis': Perfil.objects.all()})


def exibir(request, perfil_id):
    perfil = Perfil.objects.get(id=perfil_id)
    # print 'Perfil ID Recebido {}'.format(perfil_id)
    return render(request, 'perfil.html', {'perfil': perfil})

arquivo models.py

from __future__ import unicode_literals

from django.db import models

# Create your models here.


class Perfil(models.Model):

    nome = models.CharField(max_length=255, null=False)
    email = models.CharField(max_length=255, null=False)
    telefone = models.CharField(max_length=15, null=False)
    empresa = models.CharField(max_length=255, null=False)

Gostaria de saber se é possível criar um @property para acessar os "atributos" do modelo Perfil() ao invés de acessar diretamente. Por exemplo

class Perfil(models.Model):

    self.__nome = models.CharField(max_length=255, null=False)

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

Este atributo é utilizado na template html.

<!DOCTYPE html>
<html lang="pt-br">

    <head>
        <meta charset="UTF-8">
        <title>Perfil</title>
        <meta name="description" content="Pagina Perfil">

        <link href="https://maxcdn.bootstrapcdn.com/bootstrap/3.3.6/css/bootstrap.min.css" rel="stylesheet">
        <!--[if lt IE 9]>
        <script src = "http://html5shiv.googlecode.com/svn/trunk/html5.js"></script>
        <![endif]-->
    </head>

    <body>

        <script src="https://maxcdn.bootstrapcdn.com/bootstrap/3.3.6/js/bootstrap.min.js"></script>
        <script src="https://code.jquery.com/jquery-2.2.1.min.js"></script>

        <table class="table table-striped">
            <thead>
                <tr>
                    <th>Nome</th>
                    <th>Email</th>
                    <th>Telefone</th>
                    <th>Empresa</th>
                </tr>
            </thead>
            <tbody>
                <tr>
                    <td><h2><a href="{% url 'exibir' perfil.id %}">{{perfil.nome}}</a></h2></td>
                    <td><h2>{{perfil.email}}</h2></td>
                    <td><h2>{{perfil.telefone}}</h2></td>
                    <td><h2>{{perfil.empresa}}</h2></td>
                </tr>
            </tbody>
        </table>

    </body>
</html>

Att,

Obrigado

solução!

Oi José!

Pode sim, mas tem um caveat ai! A property não pode ter o mesmo nome do atributo da classe ou o Django ficará doido. Nesse seu exemplo, são nomes diferentes pois a propriedade interna usa __.

Se quiser saber mais detalhes:

https://www.stavros.io/posts/how-replace-django-model-field-property/

Feliz 2017 José!

Flavio muito obrigado! Feliz 2017 pra vc tb!