SlideShare uma empresa Scribd logo
Django
Entendendo Melhor
    Bruno Gama Catão
Templates
•   Alguns conceitos:
    •   Exibindo valores: {{variavel}}
    •   Estruturas de controle:
        •   {% if condicao %} {%else%} {%endif%}
        •   {% for expressão%} {%endfor%}
    •   Variáveix especial:
        •   {{forloop.counter}}
        •   {{forloop.revcounter}}
        •   {{forloop.first}}
        •   {{forloop.last}}
Templates
• {%ifequal valor1 valor2%} {%endifequal%}
• {%ifnotequal val1 val2%} {%endifnotequal%}
• Filtros:
 • {{valor|lower} {{valor|upper}}
 • {{nome|truncatewords: “30”}}
 • {{lista|first}} {{lista|last}} {{lista|length}}
 • {{data|date:”d/m/Y”}} - Exibe: 05/06/2010
 • {{hora|date:”f”}} - Exibe: 12:30
Como Django gera as
    páginas ?
Usuario    urls.py



          views.py      Templates

           index( )
          cadastro( )   Arquivos
            listar( )   Estáticos



                        Banco de
          models.py
                         Dados
Servindo Arquivos
       Estáticos
• Arquivos estáticos (ou de mídia):
 • css, js, imagens (jpg, gif, png, etc);
• Como fazer ?
 • Dizer qual o diretório em settings.py;
 • Ativar a aplicação “static serve” no
    arquivo urls.py.
Definindo o diretório
            de mídia
• No arquivo settings.py encontre as linhas onde estão a
  varíaveis MEDIA_ROOT e MEDIA_URL;
• Atribua um valor à variável MEDIA_ROOT com o
  caminho absoluto onde estão os seus arquivos
  estáticos:
  •   MEDIA_ROOT = 'C:/temp/media'

• Atribua um valor à variável MEDIA_URL com a URL
  que você quer usar para acessar os seus arquivos:
  •   MEDIA_URL = '/arquivos/'
Ativando o static serve

 • No arquivo urls.py adicione o seguinte import:
 •   from django.conf import settings


 • E a seguinte definição:
 •   (r'^arquivos/(?P<path>.*)$', 'django.views.static.serve',
     {'document_root': settings.MEDIA_ROOT}),


Atenção: Este padrão de URL deve obedecer o valor da variável MEDIA_URL
Testando
• Modifique a sua aplicação:
 • Defina um diretório de mídia;
 • Adicione alguns arquivos dentro;
• Inicie o servidor (de dentro do diretório onde está o
  arquivo manage.py do seu projeto):
  • python manage.py runserver
• Teste:
 • http://localhost:8000/arquivos/foto.jpg
Fazendo upload de
        arquivos
• Django possui dois tipos de dados que
  podem ser utilizados para manipular
  arquivos:
 • models.FileField;
 • models.ImageField.
Exemplo
 • Vamos supor que as nossas notícias agora
    tenham imagens:
class Noticia(models.Model):
    jornalista      = models.ForeignKey(Jornalista)
    categoria       = models.ForeignKey(Categoria)
    titulo          = models.CharField(max_length=200)
    texto           = models.TextField()
    data_publicacao = models.DateTimeField()
    foto            = models.ImageField(upload_to="fotos")

    def __unicode__(self):
        return self.titulo
Modificando o template
<html>
	 <head>
	 	 <title>{{noticia.titulo}}</title>
	 </head>
	 <body>
	 	 <p>{{noticia.categoria}}: {{noticia.jornalista}}</p>
	 	 <img src="/arquivos/{{noticia.foto}}"/>
	 	 <h1>{{noticia.titulo}}</h1>
	 	 <h2>{{noticia.texto}}</h2>
	 </body>
</html>
Testando

• Para testar apague o arquivo do banco de
  dados (meusite.db) e em seguida sincronize
  o banco de dados;
• Em seguida inicie o servidor:
 • python manage.py runserver
Por quê a separação ?
• Arquivos estáticos (mídia) e templates são
  separados por razões de segurança;
• Você pode até definir o TEMPLATE_DIRS e
  o MEDIA_ROOT para o mesmo diretório,
  porém, assim você estará permitindo que
  usuários consigam ver o conteúdo dos seus
  templates.
Formulários

• O nosso cliente pediu para que
  permitíssemos aos usuários do nosso site
  comentar as notícias;
• Para isto iremos criar uma nova entidade,
  Comentario, e vamos adicionar um
  formulário no detalhe da notícia.
Classe Comentario
• No arquivo models.py:
class Comentario(models.Model):
    noticia    = models.ForeignKey(Noticia)
    comentario = models.TextField()

    def __unicode__(self):
        return self.comentario
Modificando o template
...
	 	 <hr/>
	 	 <h3>Comente a nossa not&iacute;cia:</h3>
	 	 <form action="/noticias/comente/" method="GET">
	 	 	 <input type="hidden" name="noticia_id" value="{{noticia.id}}"/>
	 	 	 <p><textarea name="texto" rows="5" cols="40"/></p>
	 	 	 <p><input type="submit" value="Enviar"/></p>
	 	 </form>
	 	 <br/>
	 	 <ul>
	 	 {%for comentario in noticia.comentario_set.all%}
	 	 	 <li>{{comentario}}</li>
	 	 {%endfor%}
	 	 </ul>
	 </body>
</html>
Adicionando comentários
           views.py

def adicionaComentario(request):
    noticia = get_object_or_404(Noticia, pk=request.GET['noticia_id'])
    com = Comentario(comentario=request.GET['texto'], noticia=noticia)
    com.save()
    return detalhe(request, noticia.id)
Modificando o urls.py

(r'^comente/$', 'adicionaComentario'),
Testando


• Adicione alguns comentários às suas
  notícias e veja se está tudo correndo bem.
GET x POST
• Existem duas formas de passar parâmetros
  de um formulário HTML:
 • GET - Parâmetros passados através de
    URL;
 • POST - Parâmetros passados através de
    um fluxo de entrada e saída entre o
    navegador e o servidor.
GET x POST


• O método GET apresenta problemas de
  privacidade e tem uma limitação de até 256
  caracteres (limite do tamanho da URL).
Modificando o nosso
formulário para usar POST

• Django acrescenta algumas verificações de
  segurança para utilização de formulários
  POST;
• Isto evita que usuário maliciosos enviem
  dados indevidos para as nossas aplicações.
Modificando o template

<form action="/noticias/comente/" method="POST">
	 {% csrf_token %}
	 <input type="hidden" name="noticia_id" value="{{noticia.id}}"/>
	 <p><textarea name="texto" rows="5" cols="40"/></p>
	 <p><input type="submit" value="Enviar"/></p>
</form>
Modificando o views.py
from django.template import RequestContext

def detalhe(request, noticia_id):
    noticia = get_object_or_404(Noticia, pk=noticia_id)
    return render_to_response('noticias/detalhe.html', {'noticia': noticia},
                              context_instance=RequestContext(request))

def adicionaComentario(request):
    noticia = get_object_or_404(Noticia, pk=request.POST['noticia_id'])
    com = Comentario(comentario=request.POST['texto'], noticia=noticia);
    com.save()
    return detalhe(request, noticia.id)
Desafio

• Adicione os campos autor e data de
  publicação aos comentários;
• Exiba os comentários ordenados pela data
  de publicação em ordem inversa;
• Dica:
 •   models.DateTimeField(auto_now=True)
models.py

class Comentario(models.Model):
    noticia         = models.ForeignKey(Noticia)
    autor           = models.CharField(max_length=100)
    data_publicacao = models.DateTimeField(auto_now=True)
    comentario      = models.TextField()

    def __unicode__(self):
        return self.comentario
detalhe.html
...
<form action="/noticias/comente/" method="POST">
	 {% csrf_token %}
	 <input type="hidden" name="noticia_id" value="{{noticia.id}}"/>
	 <p>Autor: <input type="text" name="autor"/></p>
	 <p><textarea name="texto" rows="5" cols="40"/></p>
	 <p><input type="submit" value="Enviar"/></p>
</form>
<br/>
<ul>
{%for comentario in comentarios%}
	 <li>{{comentario.autor}} -
	     {{comentario.data_publicacao|date:"d/m/Y"}}:
	     {{comentario}}</li>
{%endfor%}
</ul>
...
views.py
def detalhe(request, noticia_id):
    noticia = get_object_or_404(Noticia, pk=noticia_id)
    comentarios = noticia.comentario_set.all().order_by('-data_publicacao')
    return render_to_response('noticias/detalhe.html',
                              {'noticia': noticia,
                               'comentarios' : comentarios},
                              context_instance=RequestContext(request))
Formatos de
          data e hora
• Visitem a página:
 • http://docs.djangoproject.com/en/dev/ref/
    templates/builtins/
• Procurem por Available format strings;
• Tem uma lista imensa de formatos de data
  e hora que podem ser utilizados.
Desafio

• Utilizem os conceitos aprendidos e implementem
  um blog;
• Dica:
 • http://pypi.python.org/pypi/django-tinymce/

Mais conteúdo relacionado

KEY
Python 06
KEY
Python 08
PDF
Introdução à MEAN Stack
PDF
Ionic 2/3 + Firebase
PDF
Como criar um plugin para WordPress
PDF
Web Offline
PDF
Django Módulo Básico Parte II
PDF
Desenvolvimento de Módulos Divi Builder
Python 06
Python 08
Introdução à MEAN Stack
Ionic 2/3 + Firebase
Como criar um plugin para WordPress
Web Offline
Django Módulo Básico Parte II
Desenvolvimento de Módulos Divi Builder

Mais procurados (20)

PDF
Iniciando com Yii Framework - Volmar Machado da Silva Neto (Rede Pampa de Com...
PDF
Desenvolvimento Web com Simfony Framework.
PDF
Evento Front End SP - Arquitetura de Front
PPTX
PDF
Mean Stack
PDF
Java script aula 10 - angularjs
PDF
Aplicações rápidas para a Web com Django
PDF
Rafael Garcia - Yii Framework, principais características e em ação
PDF
Mini curso introdutório ao Django
ODP
Construindo Sistemas Com Django
PDF
Apresentando o Yii Framework
PPTX
Desenvolvimento de Sistemas Web com PHP Frameworks - Aula 4 - 2019.1
PPTX
Desenvolvimento de Sistemas Web com PHP Frameworks - Aula 2
PPTX
Desenvolvimento de Sistemas Web com PHP Frameworks - 2019.1 - Aula 1
PPTX
Framework Yii
PDF
Ambiente de Desenvolvimento Java usando Ant
PPT
Desenvolvendo aplicações web com o framework cakephp
PDF
Angular js
PDF
Jboss tutorial
ODP
Php 05 Mvc
Iniciando com Yii Framework - Volmar Machado da Silva Neto (Rede Pampa de Com...
Desenvolvimento Web com Simfony Framework.
Evento Front End SP - Arquitetura de Front
Mean Stack
Java script aula 10 - angularjs
Aplicações rápidas para a Web com Django
Rafael Garcia - Yii Framework, principais características e em ação
Mini curso introdutório ao Django
Construindo Sistemas Com Django
Apresentando o Yii Framework
Desenvolvimento de Sistemas Web com PHP Frameworks - Aula 4 - 2019.1
Desenvolvimento de Sistemas Web com PHP Frameworks - Aula 2
Desenvolvimento de Sistemas Web com PHP Frameworks - 2019.1 - Aula 1
Framework Yii
Ambiente de Desenvolvimento Java usando Ant
Desenvolvendo aplicações web com o framework cakephp
Angular js
Jboss tutorial
Php 05 Mvc
Anúncio

Destaque (8)

KEY
Python 05
KEY
Python 02
KEY
Python 03
KEY
Python 04
KEY
Python 01
PPTX
Retina e Retinose Pigmentar
PDF
Introdução a JavaScript
PPTX
Desvendando a linguagem JavaScript
Python 05
Python 02
Python 03
Python 04
Python 01
Retina e Retinose Pigmentar
Introdução a JavaScript
Desvendando a linguagem JavaScript
Anúncio

Semelhante a Python 07 (20)

PDF
Workshop Django
PPT
Mini curso de django
PDF
Aplicacoes Rapidas Para Web Com Django
PPTX
Workshop Mundo Senai - Hello, Angular.js
PPT
Cakephp - framework de desenvolvimento de aplicações Web em PHP
PDF
Como desenvolver uma aplicação Web com django 2.2.13 (Parte 2 de 2)
PDF
Implementação de
PPTX
Backbone.js nas trincheiras
PPTX
Gestão automática de configuração usando puppet
PDF
Desenvolvimento em .Net - nHibernate
PDF
Django: Desenvolvendo uma aplicação web em minutos
PPTX
Fundamentos da Programação PHP OO - Aula 1
PPTX
ASP .NET 4.0 WebForms, Novas funcionalidades
PDF
Play Framework - FLISOL
KEY
Oficina de Django
PDF
Workshop Web e WordPress
ODP
Workshop - Desenvolvimento web com Drupal 7
PPTX
Workshop Django Framework - 30/10/2018
PPTX
Desenvolvimento Web com PHP - Aula 3
ODP
Introdução ao framework CodeIgniter
Workshop Django
Mini curso de django
Aplicacoes Rapidas Para Web Com Django
Workshop Mundo Senai - Hello, Angular.js
Cakephp - framework de desenvolvimento de aplicações Web em PHP
Como desenvolver uma aplicação Web com django 2.2.13 (Parte 2 de 2)
Implementação de
Backbone.js nas trincheiras
Gestão automática de configuração usando puppet
Desenvolvimento em .Net - nHibernate
Django: Desenvolvendo uma aplicação web em minutos
Fundamentos da Programação PHP OO - Aula 1
ASP .NET 4.0 WebForms, Novas funcionalidades
Play Framework - FLISOL
Oficina de Django
Workshop Web e WordPress
Workshop - Desenvolvimento web com Drupal 7
Workshop Django Framework - 30/10/2018
Desenvolvimento Web com PHP - Aula 3
Introdução ao framework CodeIgniter

Mais de Bruno Catão (11)

PPTX
Introdução às Redes Neurais - Parte 2/2
PPTX
Introdução às Redes Neurais - Parte 1/2
PPTX
React JS - Parte 2
PPTX
React JS - Parte 1
PPTX
Node JS - Parte 4
PPTX
Node JS - Parte 3
PPTX
Node JS - Parte 2
PPTX
Node JS - Parte 1
PDF
Unity3d Space Shooter (Parte 1)
KEY
Introdução ao Framework Grails
PPTX
O framework spring
Introdução às Redes Neurais - Parte 2/2
Introdução às Redes Neurais - Parte 1/2
React JS - Parte 2
React JS - Parte 1
Node JS - Parte 4
Node JS - Parte 3
Node JS - Parte 2
Node JS - Parte 1
Unity3d Space Shooter (Parte 1)
Introdução ao Framework Grails
O framework spring

Último (19)

PDF
Gestão de transportes básica no SAP S/4HANA, S4611 Col20
PPTX
Gestao-de-Bugs-em-Software-Introducao.pptxxxxxxxx
PDF
COBITxITIL-Entenda as diferença em uso governança TI
PDF
Apple Pippin Uma breve introdução. - David Glotz
PPTX
Programação - Linguagem C - Variáveis, Palavras Reservadas, tipos de dados, c...
PPTX
Informática Aplicada Informática Aplicada Plano de Ensino - estudo de caso NR...
PDF
Aula04-Academia Heri- Tecnologia Geral 2025
PPTX
Aula16ManipulaçãoDadosssssssssssssssssssssssssssss
PDF
Custos e liquidação no SAP Transportation Management, TM130 Col18
PPTX
BANCO DE DADOS - AULAS INICIAIS-sgbd.pptx
PDF
Processos na gestão de transportes, TM100 Col18
PDF
Otimizador de planejamento e execução no SAP Transportation Management, TM120...
PPTX
Aula 18 - Manipulacao De Arquivos python
PPTX
Como-se-implementa-um-softwareeeeeeeeeeeeeeeeeeeeeeeee.pptx
PDF
Fundamentos de gerenciamento de ordens e planejamento no SAP TransportationMa...
PDF
Fullfilment AI - Forum ecommerce 2025 // Distrito e Total Express
PDF
20250805_ServiceNow e a Arquitetura Orientada a Serviços (SOA) A Base para Ap...
PDF
Mergulho profundo técnico para gestão de transportes no SAP S/4HANA, S4TM6 Col14
PDF
Custos e faturamento no SAP S/4HANA Transportation Management, S4TM3 Col26
Gestão de transportes básica no SAP S/4HANA, S4611 Col20
Gestao-de-Bugs-em-Software-Introducao.pptxxxxxxxx
COBITxITIL-Entenda as diferença em uso governança TI
Apple Pippin Uma breve introdução. - David Glotz
Programação - Linguagem C - Variáveis, Palavras Reservadas, tipos de dados, c...
Informática Aplicada Informática Aplicada Plano de Ensino - estudo de caso NR...
Aula04-Academia Heri- Tecnologia Geral 2025
Aula16ManipulaçãoDadosssssssssssssssssssssssssssss
Custos e liquidação no SAP Transportation Management, TM130 Col18
BANCO DE DADOS - AULAS INICIAIS-sgbd.pptx
Processos na gestão de transportes, TM100 Col18
Otimizador de planejamento e execução no SAP Transportation Management, TM120...
Aula 18 - Manipulacao De Arquivos python
Como-se-implementa-um-softwareeeeeeeeeeeeeeeeeeeeeeeee.pptx
Fundamentos de gerenciamento de ordens e planejamento no SAP TransportationMa...
Fullfilment AI - Forum ecommerce 2025 // Distrito e Total Express
20250805_ServiceNow e a Arquitetura Orientada a Serviços (SOA) A Base para Ap...
Mergulho profundo técnico para gestão de transportes no SAP S/4HANA, S4TM6 Col14
Custos e faturamento no SAP S/4HANA Transportation Management, S4TM3 Col26

Python 07

  • 1. Django Entendendo Melhor Bruno Gama Catão
  • 2. Templates • Alguns conceitos: • Exibindo valores: {{variavel}} • Estruturas de controle: • {% if condicao %} {%else%} {%endif%} • {% for expressão%} {%endfor%} • Variáveix especial: • {{forloop.counter}} • {{forloop.revcounter}} • {{forloop.first}} • {{forloop.last}}
  • 3. Templates • {%ifequal valor1 valor2%} {%endifequal%} • {%ifnotequal val1 val2%} {%endifnotequal%} • Filtros: • {{valor|lower} {{valor|upper}} • {{nome|truncatewords: “30”}} • {{lista|first}} {{lista|last}} {{lista|length}} • {{data|date:”d/m/Y”}} - Exibe: 05/06/2010 • {{hora|date:”f”}} - Exibe: 12:30
  • 4. Como Django gera as páginas ?
  • 5. Usuario urls.py views.py Templates index( ) cadastro( ) Arquivos listar( ) Estáticos Banco de models.py Dados
  • 6. Servindo Arquivos Estáticos • Arquivos estáticos (ou de mídia): • css, js, imagens (jpg, gif, png, etc); • Como fazer ? • Dizer qual o diretório em settings.py; • Ativar a aplicação “static serve” no arquivo urls.py.
  • 7. Definindo o diretório de mídia • No arquivo settings.py encontre as linhas onde estão a varíaveis MEDIA_ROOT e MEDIA_URL; • Atribua um valor à variável MEDIA_ROOT com o caminho absoluto onde estão os seus arquivos estáticos: • MEDIA_ROOT = 'C:/temp/media' • Atribua um valor à variável MEDIA_URL com a URL que você quer usar para acessar os seus arquivos: • MEDIA_URL = '/arquivos/'
  • 8. Ativando o static serve • No arquivo urls.py adicione o seguinte import: • from django.conf import settings • E a seguinte definição: • (r'^arquivos/(?P<path>.*)$', 'django.views.static.serve', {'document_root': settings.MEDIA_ROOT}), Atenção: Este padrão de URL deve obedecer o valor da variável MEDIA_URL
  • 9. Testando • Modifique a sua aplicação: • Defina um diretório de mídia; • Adicione alguns arquivos dentro; • Inicie o servidor (de dentro do diretório onde está o arquivo manage.py do seu projeto): • python manage.py runserver • Teste: • http://localhost:8000/arquivos/foto.jpg
  • 10. Fazendo upload de arquivos • Django possui dois tipos de dados que podem ser utilizados para manipular arquivos: • models.FileField; • models.ImageField.
  • 11. Exemplo • Vamos supor que as nossas notícias agora tenham imagens: class Noticia(models.Model): jornalista = models.ForeignKey(Jornalista) categoria = models.ForeignKey(Categoria) titulo = models.CharField(max_length=200) texto = models.TextField() data_publicacao = models.DateTimeField() foto = models.ImageField(upload_to="fotos") def __unicode__(self): return self.titulo
  • 12. Modificando o template <html> <head> <title>{{noticia.titulo}}</title> </head> <body> <p>{{noticia.categoria}}: {{noticia.jornalista}}</p> <img src="/arquivos/{{noticia.foto}}"/> <h1>{{noticia.titulo}}</h1> <h2>{{noticia.texto}}</h2> </body> </html>
  • 13. Testando • Para testar apague o arquivo do banco de dados (meusite.db) e em seguida sincronize o banco de dados; • Em seguida inicie o servidor: • python manage.py runserver
  • 14. Por quê a separação ? • Arquivos estáticos (mídia) e templates são separados por razões de segurança; • Você pode até definir o TEMPLATE_DIRS e o MEDIA_ROOT para o mesmo diretório, porém, assim você estará permitindo que usuários consigam ver o conteúdo dos seus templates.
  • 15. Formulários • O nosso cliente pediu para que permitíssemos aos usuários do nosso site comentar as notícias; • Para isto iremos criar uma nova entidade, Comentario, e vamos adicionar um formulário no detalhe da notícia.
  • 16. Classe Comentario • No arquivo models.py: class Comentario(models.Model): noticia = models.ForeignKey(Noticia) comentario = models.TextField() def __unicode__(self): return self.comentario
  • 17. Modificando o template ... <hr/> <h3>Comente a nossa not&iacute;cia:</h3> <form action="/noticias/comente/" method="GET"> <input type="hidden" name="noticia_id" value="{{noticia.id}}"/> <p><textarea name="texto" rows="5" cols="40"/></p> <p><input type="submit" value="Enviar"/></p> </form> <br/> <ul> {%for comentario in noticia.comentario_set.all%} <li>{{comentario}}</li> {%endfor%} </ul> </body> </html>
  • 18. Adicionando comentários views.py def adicionaComentario(request): noticia = get_object_or_404(Noticia, pk=request.GET['noticia_id']) com = Comentario(comentario=request.GET['texto'], noticia=noticia) com.save() return detalhe(request, noticia.id)
  • 19. Modificando o urls.py (r'^comente/$', 'adicionaComentario'),
  • 20. Testando • Adicione alguns comentários às suas notícias e veja se está tudo correndo bem.
  • 21. GET x POST • Existem duas formas de passar parâmetros de um formulário HTML: • GET - Parâmetros passados através de URL; • POST - Parâmetros passados através de um fluxo de entrada e saída entre o navegador e o servidor.
  • 22. GET x POST • O método GET apresenta problemas de privacidade e tem uma limitação de até 256 caracteres (limite do tamanho da URL).
  • 23. Modificando o nosso formulário para usar POST • Django acrescenta algumas verificações de segurança para utilização de formulários POST; • Isto evita que usuário maliciosos enviem dados indevidos para as nossas aplicações.
  • 24. Modificando o template <form action="/noticias/comente/" method="POST"> {% csrf_token %} <input type="hidden" name="noticia_id" value="{{noticia.id}}"/> <p><textarea name="texto" rows="5" cols="40"/></p> <p><input type="submit" value="Enviar"/></p> </form>
  • 25. Modificando o views.py from django.template import RequestContext def detalhe(request, noticia_id): noticia = get_object_or_404(Noticia, pk=noticia_id) return render_to_response('noticias/detalhe.html', {'noticia': noticia}, context_instance=RequestContext(request)) def adicionaComentario(request): noticia = get_object_or_404(Noticia, pk=request.POST['noticia_id']) com = Comentario(comentario=request.POST['texto'], noticia=noticia); com.save() return detalhe(request, noticia.id)
  • 26. Desafio • Adicione os campos autor e data de publicação aos comentários; • Exiba os comentários ordenados pela data de publicação em ordem inversa; • Dica: • models.DateTimeField(auto_now=True)
  • 27. models.py class Comentario(models.Model): noticia = models.ForeignKey(Noticia) autor = models.CharField(max_length=100) data_publicacao = models.DateTimeField(auto_now=True) comentario = models.TextField() def __unicode__(self): return self.comentario
  • 28. detalhe.html ... <form action="/noticias/comente/" method="POST"> {% csrf_token %} <input type="hidden" name="noticia_id" value="{{noticia.id}}"/> <p>Autor: <input type="text" name="autor"/></p> <p><textarea name="texto" rows="5" cols="40"/></p> <p><input type="submit" value="Enviar"/></p> </form> <br/> <ul> {%for comentario in comentarios%} <li>{{comentario.autor}} - {{comentario.data_publicacao|date:"d/m/Y"}}: {{comentario}}</li> {%endfor%} </ul> ...
  • 29. views.py def detalhe(request, noticia_id): noticia = get_object_or_404(Noticia, pk=noticia_id) comentarios = noticia.comentario_set.all().order_by('-data_publicacao') return render_to_response('noticias/detalhe.html', {'noticia': noticia, 'comentarios' : comentarios}, context_instance=RequestContext(request))
  • 30. Formatos de data e hora • Visitem a página: • http://docs.djangoproject.com/en/dev/ref/ templates/builtins/ • Procurem por Available format strings; • Tem uma lista imensa de formatos de data e hora que podem ser utilizados.
  • 31. Desafio • Utilizem os conceitos aprendidos e implementem um blog; • Dica: • http://pypi.python.org/pypi/django-tinymce/

Notas do Editor