SlideShare uma empresa Scribd logo
1 de 31
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

Mais procurados

Iniciando com Yii Framework - Volmar Machado da Silva Neto (Rede Pampa de Com...
Iniciando com Yii Framework - Volmar Machado da Silva Neto (Rede Pampa de Com...Iniciando com Yii Framework - Volmar Machado da Silva Neto (Rede Pampa de Com...
Iniciando com Yii Framework - Volmar Machado da Silva Neto (Rede Pampa de Com...Tchelinux
 
Desenvolvimento Web com Simfony Framework.
Desenvolvimento Web com Simfony Framework.Desenvolvimento Web com Simfony Framework.
Desenvolvimento Web com Simfony Framework.Vinícius de Paula
 
Evento Front End SP - Arquitetura de Front
Evento Front End SP - Arquitetura de FrontEvento Front End SP - Arquitetura de Front
Evento Front End SP - Arquitetura de FrontMichel Ribeiro
 
Aplicações rápidas para a Web com Django
Aplicações rápidas para a Web com DjangoAplicações rápidas para a Web com Django
Aplicações rápidas para a Web com DjangoFreedom DayMS
 
Rafael Garcia - Yii Framework, principais características e em ação
Rafael Garcia - Yii Framework, principais características e em açãoRafael Garcia - Yii Framework, principais características e em ação
Rafael Garcia - Yii Framework, principais características e em açãoRafael Garcia
 
Mini curso introdutório ao Django
Mini curso introdutório ao DjangoMini curso introdutório ao Django
Mini curso introdutório ao DjangoVinicius Mendes
 
Construindo Sistemas Com Django
Construindo Sistemas Com DjangoConstruindo Sistemas Com Django
Construindo Sistemas Com DjangoMarinho Brandão
 
Apresentando o Yii Framework
Apresentando o Yii FrameworkApresentando o Yii Framework
Apresentando o Yii Frameworkangellicacardozo
 
Desenvolvimento de Sistemas Web com PHP Frameworks - Aula 4 - 2019.1
Desenvolvimento de Sistemas Web com PHP Frameworks - Aula 4 - 2019.1Desenvolvimento de Sistemas Web com PHP Frameworks - Aula 4 - 2019.1
Desenvolvimento de Sistemas Web com PHP Frameworks - Aula 4 - 2019.1Thyago Maia
 
Desenvolvimento de Sistemas Web com PHP Frameworks - Aula 2
Desenvolvimento de Sistemas Web com PHP Frameworks - Aula 2Desenvolvimento de Sistemas Web com PHP Frameworks - Aula 2
Desenvolvimento de Sistemas Web com PHP Frameworks - Aula 2Thyago Maia
 
Desenvolvimento de Sistemas Web com PHP Frameworks - 2019.1 - Aula 1
Desenvolvimento de Sistemas Web com PHP Frameworks - 2019.1 - Aula 1Desenvolvimento de Sistemas Web com PHP Frameworks - 2019.1 - Aula 1
Desenvolvimento de Sistemas Web com PHP Frameworks - 2019.1 - Aula 1Thyago Maia
 
Ambiente de Desenvolvimento Java usando Ant
Ambiente de Desenvolvimento Java usando AntAmbiente de Desenvolvimento Java usando Ant
Ambiente de Desenvolvimento Java usando AntDenis L Presciliano
 
Desenvolvendo aplicações web com o framework cakephp
Desenvolvendo aplicações web com o framework cakephpDesenvolvendo aplicações web com o framework cakephp
Desenvolvendo aplicações web com o framework cakephpRodrigo Aramburu
 

Mais procurados (20)

Iniciando com Yii Framework - Volmar Machado da Silva Neto (Rede Pampa de Com...
Iniciando com Yii Framework - Volmar Machado da Silva Neto (Rede Pampa de Com...Iniciando com Yii Framework - Volmar Machado da Silva Neto (Rede Pampa de Com...
Iniciando com Yii Framework - Volmar Machado da Silva Neto (Rede Pampa de Com...
 
Desenvolvimento Web com Simfony Framework.
Desenvolvimento Web com Simfony Framework.Desenvolvimento Web com Simfony Framework.
Desenvolvimento Web com Simfony Framework.
 
Evento Front End SP - Arquitetura de Front
Evento Front End SP - Arquitetura de FrontEvento Front End SP - Arquitetura de Front
Evento Front End SP - Arquitetura de Front
 
Palestra
PalestraPalestra
Palestra
 
Mean Stack
Mean StackMean Stack
Mean Stack
 
Java script aula 10 - angularjs
Java script   aula 10 - angularjsJava script   aula 10 - angularjs
Java script aula 10 - angularjs
 
Aplicações rápidas para a Web com Django
Aplicações rápidas para a Web com DjangoAplicações rápidas para a Web com Django
Aplicações rápidas para a Web com Django
 
Rafael Garcia - Yii Framework, principais características e em ação
Rafael Garcia - Yii Framework, principais características e em açãoRafael Garcia - Yii Framework, principais características e em ação
Rafael Garcia - Yii Framework, principais características e em ação
 
Mini curso introdutório ao Django
Mini curso introdutório ao DjangoMini curso introdutório ao Django
Mini curso introdutório ao Django
 
Construindo Sistemas Com Django
Construindo Sistemas Com DjangoConstruindo Sistemas Com Django
Construindo Sistemas Com Django
 
Apresentando o Yii Framework
Apresentando o Yii FrameworkApresentando o Yii Framework
Apresentando o Yii Framework
 
Desenvolvimento de Sistemas Web com PHP Frameworks - Aula 4 - 2019.1
Desenvolvimento de Sistemas Web com PHP Frameworks - Aula 4 - 2019.1Desenvolvimento de Sistemas Web com PHP Frameworks - Aula 4 - 2019.1
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 - Aula 2Desenvolvimento de Sistemas Web com PHP Frameworks - Aula 2
Desenvolvimento de Sistemas Web com PHP Frameworks - Aula 2
 
Desenvolvimento de Sistemas Web com PHP Frameworks - 2019.1 - Aula 1
Desenvolvimento de Sistemas Web com PHP Frameworks - 2019.1 - Aula 1Desenvolvimento de Sistemas Web com PHP Frameworks - 2019.1 - Aula 1
Desenvolvimento de Sistemas Web com PHP Frameworks - 2019.1 - Aula 1
 
Framework Yii
Framework YiiFramework Yii
Framework Yii
 
Ambiente de Desenvolvimento Java usando Ant
Ambiente de Desenvolvimento Java usando AntAmbiente de Desenvolvimento Java usando Ant
Ambiente de Desenvolvimento Java usando Ant
 
Desenvolvendo aplicações web com o framework cakephp
Desenvolvendo aplicações web com o framework cakephpDesenvolvendo aplicações web com o framework cakephp
Desenvolvendo aplicações web com o framework cakephp
 
Angular js
Angular jsAngular js
Angular js
 
Jboss tutorial
Jboss tutorialJboss tutorial
Jboss tutorial
 
Php 05 Mvc
Php 05 MvcPhp 05 Mvc
Php 05 Mvc
 

Destaque

Destaque (8)

Python 05
Python 05Python 05
Python 05
 
Python 02
Python 02Python 02
Python 02
 
Python 03
Python 03Python 03
Python 03
 
Python 04
Python 04Python 04
Python 04
 
Python 01
Python 01Python 01
Python 01
 
Retina e Retinose Pigmentar
Retina e Retinose PigmentarRetina e Retinose Pigmentar
Retina e Retinose Pigmentar
 
Introdução a JavaScript
Introdução a JavaScriptIntrodução a JavaScript
Introdução a JavaScript
 
Desvendando a linguagem JavaScript
Desvendando a linguagem JavaScriptDesvendando a linguagem JavaScript
Desvendando a linguagem JavaScript
 

Semelhante a Python 07

Mini curso de django
Mini curso de djangoMini curso de django
Mini curso de djangorosenclever
 
Workshop Mundo Senai - Hello, Angular.js
Workshop Mundo Senai - Hello, Angular.jsWorkshop Mundo Senai - Hello, Angular.js
Workshop Mundo Senai - Hello, Angular.jsFábio Elísio
 
Cakephp - framework de desenvolvimento de aplicações Web em PHP
Cakephp - framework de desenvolvimento de aplicações Web em PHPCakephp - framework de desenvolvimento de aplicações Web em PHP
Cakephp - framework de desenvolvimento de aplicações Web em PHPArlindo Santos
 
Como desenvolver uma aplicação Web com django 2.2.13 (Parte 2 de 2)
Como desenvolver uma aplicação Web com django 2.2.13 (Parte 2 de 2)Como desenvolver uma aplicação Web com django 2.2.13 (Parte 2 de 2)
Como desenvolver uma aplicação Web com django 2.2.13 (Parte 2 de 2)Pedro Fernandes Vieira
 
Backbone.js nas trincheiras
Backbone.js nas trincheirasBackbone.js nas trincheiras
Backbone.js nas trincheirasLambda 3
 
Gestão automática de configuração usando puppet
Gestão automática de configuração usando puppetGestão automática de configuração usando puppet
Gestão automática de configuração usando puppetDaniel Sobral
 
Desenvolvimento em .Net - nHibernate
Desenvolvimento em .Net - nHibernateDesenvolvimento em .Net - nHibernate
Desenvolvimento em .Net - nHibernateVitor Silva
 
Django: Desenvolvendo uma aplicação web em minutos
Django: Desenvolvendo uma aplicação web em minutosDjango: Desenvolvendo uma aplicação web em minutos
Django: Desenvolvendo uma aplicação web em minutosRodrigo Nossal
 
Fundamentos da Programação PHP OO - Aula 1
Fundamentos da Programação PHP OO - Aula 1Fundamentos da Programação PHP OO - Aula 1
Fundamentos da Programação PHP OO - Aula 1Thyago Maia
 
ASP .NET 4.0 WebForms, Novas funcionalidades
ASP .NET 4.0 WebForms, Novas funcionalidadesASP .NET 4.0 WebForms, Novas funcionalidades
ASP .NET 4.0 WebForms, Novas funcionalidadesC. Augusto Proiete
 
Play Framework - FLISOL
Play Framework - FLISOLPlay Framework - FLISOL
Play Framework - FLISOLgrupoweblovers
 
Workshop Web e WordPress
Workshop Web e WordPressWorkshop Web e WordPress
Workshop Web e WordPressHaste Design
 
Workshop - Desenvolvimento web com Drupal 7
Workshop - Desenvolvimento web com Drupal 7Workshop - Desenvolvimento web com Drupal 7
Workshop - Desenvolvimento web com Drupal 7Sérgio Lima
 
Workshop Django Framework - 30/10/2018
Workshop Django Framework - 30/10/2018Workshop Django Framework - 30/10/2018
Workshop Django Framework - 30/10/2018Rafael Sales Pavarina
 
Desenvolvimento Web com PHP - Aula 3
Desenvolvimento Web com PHP - Aula 3Desenvolvimento Web com PHP - Aula 3
Desenvolvimento Web com PHP - Aula 3Thyago Maia
 
Introdução ao framework CodeIgniter
Introdução ao framework CodeIgniterIntrodução ao framework CodeIgniter
Introdução ao framework CodeIgniterAnderson Gonçalves
 

Semelhante a Python 07 (20)

Workshop Django
Workshop DjangoWorkshop Django
Workshop Django
 
Mini curso de django
Mini curso de djangoMini curso de django
Mini curso de django
 
Aplicacoes Rapidas Para Web Com Django
Aplicacoes Rapidas Para Web Com DjangoAplicacoes Rapidas Para Web Com Django
Aplicacoes Rapidas Para Web Com Django
 
Workshop Mundo Senai - Hello, Angular.js
Workshop Mundo Senai - Hello, Angular.jsWorkshop Mundo Senai - Hello, Angular.js
Workshop Mundo Senai - Hello, Angular.js
 
Cakephp - framework de desenvolvimento de aplicações Web em PHP
Cakephp - framework de desenvolvimento de aplicações Web em PHPCakephp - framework de desenvolvimento de aplicações Web em PHP
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)
Como desenvolver uma aplicação Web com django 2.2.13 (Parte 2 de 2)Como desenvolver uma aplicação Web com django 2.2.13 (Parte 2 de 2)
Como desenvolver uma aplicação Web com django 2.2.13 (Parte 2 de 2)
 
Implementação de
Implementação de Implementação de
Implementação de
 
Backbone.js nas trincheiras
Backbone.js nas trincheirasBackbone.js nas trincheiras
Backbone.js nas trincheiras
 
Gestão automática de configuração usando puppet
Gestão automática de configuração usando puppetGestão automática de configuração usando puppet
Gestão automática de configuração usando puppet
 
Desenvolvimento em .Net - nHibernate
Desenvolvimento em .Net - nHibernateDesenvolvimento em .Net - nHibernate
Desenvolvimento em .Net - nHibernate
 
Django: Desenvolvendo uma aplicação web em minutos
Django: Desenvolvendo uma aplicação web em minutosDjango: Desenvolvendo uma aplicação web em minutos
Django: Desenvolvendo uma aplicação web em minutos
 
Fundamentos da Programação PHP OO - Aula 1
Fundamentos da Programação PHP OO - Aula 1Fundamentos da Programação PHP OO - Aula 1
Fundamentos da Programação PHP OO - Aula 1
 
ASP .NET 4.0 WebForms, Novas funcionalidades
ASP .NET 4.0 WebForms, Novas funcionalidadesASP .NET 4.0 WebForms, Novas funcionalidades
ASP .NET 4.0 WebForms, Novas funcionalidades
 
Play Framework - FLISOL
Play Framework - FLISOLPlay Framework - FLISOL
Play Framework - FLISOL
 
Oficina de Django
Oficina de DjangoOficina de Django
Oficina de Django
 
Workshop Web e WordPress
Workshop Web e WordPressWorkshop Web e WordPress
Workshop Web e WordPress
 
Workshop - Desenvolvimento web com Drupal 7
Workshop - Desenvolvimento web com Drupal 7Workshop - Desenvolvimento web com Drupal 7
Workshop - Desenvolvimento web com Drupal 7
 
Workshop Django Framework - 30/10/2018
Workshop Django Framework - 30/10/2018Workshop Django Framework - 30/10/2018
Workshop Django Framework - 30/10/2018
 
Desenvolvimento Web com PHP - Aula 3
Desenvolvimento Web com PHP - Aula 3Desenvolvimento Web com PHP - Aula 3
Desenvolvimento Web com PHP - Aula 3
 
Introdução ao framework CodeIgniter
Introdução ao framework CodeIgniterIntrodução ao framework CodeIgniter
Introdução ao framework CodeIgniter
 

Mais de Bruno Catão

Introdução às Redes Neurais - Parte 2/2
Introdução às Redes Neurais - Parte 2/2Introdução às Redes Neurais - Parte 2/2
Introdução às Redes Neurais - Parte 2/2Bruno Catão
 
Introdução às Redes Neurais - Parte 1/2
Introdução às Redes Neurais - Parte 1/2Introdução às Redes Neurais - Parte 1/2
Introdução às Redes Neurais - Parte 1/2Bruno Catão
 
React JS - Parte 2
React JS - Parte 2React JS - Parte 2
React JS - Parte 2Bruno Catão
 
React JS - Parte 1
React JS - Parte 1React JS - Parte 1
React JS - Parte 1Bruno Catão
 
Unity3d Space Shooter (Parte 1)
Unity3d Space Shooter (Parte 1)Unity3d Space Shooter (Parte 1)
Unity3d Space Shooter (Parte 1)Bruno Catão
 
Introdução ao Framework Grails
Introdução ao Framework GrailsIntrodução ao Framework Grails
Introdução ao Framework GrailsBruno Catão
 
O framework spring
O framework springO framework spring
O framework springBruno Catão
 

Mais de Bruno Catão (11)

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

Último

Boas práticas de programação com Object Calisthenics
Boas práticas de programação com Object CalisthenicsBoas práticas de programação com Object Calisthenics
Boas práticas de programação com Object CalisthenicsDanilo Pinotti
 
ATIVIDADE 1 - SISTEMAS DISTRIBUÍDOS E REDES - 52_2024.docx
ATIVIDADE 1 - SISTEMAS DISTRIBUÍDOS E REDES - 52_2024.docxATIVIDADE 1 - SISTEMAS DISTRIBUÍDOS E REDES - 52_2024.docx
ATIVIDADE 1 - SISTEMAS DISTRIBUÍDOS E REDES - 52_2024.docx2m Assessoria
 
ATIVIDADE 1 - ESTRUTURA DE DADOS II - 52_2024.docx
ATIVIDADE 1 - ESTRUTURA DE DADOS II - 52_2024.docxATIVIDADE 1 - ESTRUTURA DE DADOS II - 52_2024.docx
ATIVIDADE 1 - ESTRUTURA DE DADOS II - 52_2024.docx2m Assessoria
 
ATIVIDADE 1 - LOGÍSTICA EMPRESARIAL - 52_2024.docx
ATIVIDADE 1 - LOGÍSTICA EMPRESARIAL - 52_2024.docxATIVIDADE 1 - LOGÍSTICA EMPRESARIAL - 52_2024.docx
ATIVIDADE 1 - LOGÍSTICA EMPRESARIAL - 52_2024.docx2m Assessoria
 
ATIVIDADE 1 - CUSTOS DE PRODUÇÃO - 52_2024.docx
ATIVIDADE 1 - CUSTOS DE PRODUÇÃO - 52_2024.docxATIVIDADE 1 - CUSTOS DE PRODUÇÃO - 52_2024.docx
ATIVIDADE 1 - CUSTOS DE PRODUÇÃO - 52_2024.docx2m Assessoria
 
Programação Orientada a Objetos - 4 Pilares.pdf
Programação Orientada a Objetos - 4 Pilares.pdfProgramação Orientada a Objetos - 4 Pilares.pdf
Programação Orientada a Objetos - 4 Pilares.pdfSamaraLunas
 
ATIVIDADE 1 - GCOM - GESTÃO DA INFORMAÇÃO - 54_2024.docx
ATIVIDADE 1 - GCOM - GESTÃO DA INFORMAÇÃO - 54_2024.docxATIVIDADE 1 - GCOM - GESTÃO DA INFORMAÇÃO - 54_2024.docx
ATIVIDADE 1 - GCOM - GESTÃO DA INFORMAÇÃO - 54_2024.docx2m Assessoria
 
Luís Kitota AWS Discovery Day Ka Solution.pdf
Luís Kitota AWS Discovery Day Ka Solution.pdfLuís Kitota AWS Discovery Day Ka Solution.pdf
Luís Kitota AWS Discovery Day Ka Solution.pdfLuisKitota
 
Padrões de Projeto: Proxy e Command com exemplo
Padrões de Projeto: Proxy e Command com exemploPadrões de Projeto: Proxy e Command com exemplo
Padrões de Projeto: Proxy e Command com exemploDanilo Pinotti
 

Último (9)

Boas práticas de programação com Object Calisthenics
Boas práticas de programação com Object CalisthenicsBoas práticas de programação com Object Calisthenics
Boas práticas de programação com Object Calisthenics
 
ATIVIDADE 1 - SISTEMAS DISTRIBUÍDOS E REDES - 52_2024.docx
ATIVIDADE 1 - SISTEMAS DISTRIBUÍDOS E REDES - 52_2024.docxATIVIDADE 1 - SISTEMAS DISTRIBUÍDOS E REDES - 52_2024.docx
ATIVIDADE 1 - SISTEMAS DISTRIBUÍDOS E REDES - 52_2024.docx
 
ATIVIDADE 1 - ESTRUTURA DE DADOS II - 52_2024.docx
ATIVIDADE 1 - ESTRUTURA DE DADOS II - 52_2024.docxATIVIDADE 1 - ESTRUTURA DE DADOS II - 52_2024.docx
ATIVIDADE 1 - ESTRUTURA DE DADOS II - 52_2024.docx
 
ATIVIDADE 1 - LOGÍSTICA EMPRESARIAL - 52_2024.docx
ATIVIDADE 1 - LOGÍSTICA EMPRESARIAL - 52_2024.docxATIVIDADE 1 - LOGÍSTICA EMPRESARIAL - 52_2024.docx
ATIVIDADE 1 - LOGÍSTICA EMPRESARIAL - 52_2024.docx
 
ATIVIDADE 1 - CUSTOS DE PRODUÇÃO - 52_2024.docx
ATIVIDADE 1 - CUSTOS DE PRODUÇÃO - 52_2024.docxATIVIDADE 1 - CUSTOS DE PRODUÇÃO - 52_2024.docx
ATIVIDADE 1 - CUSTOS DE PRODUÇÃO - 52_2024.docx
 
Programação Orientada a Objetos - 4 Pilares.pdf
Programação Orientada a Objetos - 4 Pilares.pdfProgramação Orientada a Objetos - 4 Pilares.pdf
Programação Orientada a Objetos - 4 Pilares.pdf
 
ATIVIDADE 1 - GCOM - GESTÃO DA INFORMAÇÃO - 54_2024.docx
ATIVIDADE 1 - GCOM - GESTÃO DA INFORMAÇÃO - 54_2024.docxATIVIDADE 1 - GCOM - GESTÃO DA INFORMAÇÃO - 54_2024.docx
ATIVIDADE 1 - GCOM - GESTÃO DA INFORMAÇÃO - 54_2024.docx
 
Luís Kitota AWS Discovery Day Ka Solution.pdf
Luís Kitota AWS Discovery Day Ka Solution.pdfLuís Kitota AWS Discovery Day Ka Solution.pdf
Luís Kitota AWS Discovery Day Ka Solution.pdf
 
Padrões de Projeto: Proxy e Command com exemplo
Padrões de Projeto: Proxy e Command com exemploPadrões de Projeto: Proxy e Command com exemplo
Padrões de Projeto: Proxy e Command com exemplo
 

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

  1. \n
  2. \n
  3. \n
  4. \n
  5. \n
  6. \n
  7. \n
  8. \n
  9. \n
  10. \n
  11. \n
  12. \n
  13. \n
  14. \n
  15. \n
  16. \n
  17. \n
  18. \n
  19. \n
  20. \n
  21. \n
  22. \n
  23. \n
  24. \n
  25. \n
  26. \n
  27. \n
  28. \n
  29. \n
  30. \n
  31. \n