DjangoEntendendo Melhor    Bruno Gama Catão
Templates•   Alguns conceitos:    •   Exibindo valores: {{variavel}}    •   Estruturas de controle:        •   {% if condi...
Templates• {%ifequal valor1 valor2%} {%endifequal%}• {%ifnotequal val1 val2%} {%endifnotequal%}• Filtros: • {{valor|lower}...
Como Django gera as    páginas ?
Usuario    urls.py          views.py      Templates           index( )          cadastro( )   Arquivos            listar( ...
Servindo Arquivos       Estáticos• Arquivos estáticos (ou de mídia): • css, js, imagens (jpg, gif, png, etc);• Como fazer ...
Definindo o diretório            de mídia• No arquivo settings.py encontre as linhas onde estão a  varíaveis MEDIA_ROOT e M...
Ativando o static serve • No arquivo urls.py adicione o seguinte import: •   from django.conf import settings • E a seguin...
Testando• Modifique a sua aplicação: • Defina um diretório de mídia; • Adicione alguns arquivos dentro;• Inicie o servidor (...
Fazendo upload de        arquivos• Django possui dois tipos de dados que  podem ser utilizados para manipular  arquivos: •...
Exemplo • Vamos supor que as nossas notícias agora    tenham imagens:class Noticia(models.Model):    jornalista      = mod...
Modificando o template<html>	 <head>	 	 <title>{{noticia.titulo}}</title>	 </head>	 <body>	 	 <p>{{noticia.categoria}}: {{n...
Testando• Para testar apague o arquivo do banco de  dados (meusite.db) e em seguida sincronize  o banco de dados;• Em segu...
Por quê a separação ?• Arquivos estáticos (mídia) e templates são  separados por razões de segurança;• Você pode até defini...
Formulários• O nosso cliente pediu para que  permitíssemos aos usuários do nosso site  comentar as notícias;• Para isto ir...
Classe Comentario• No arquivo models.py:class Comentario(models.Model):    noticia    = models.ForeignKey(Noticia)    come...
Modificando o template...	 	 <hr/>	 	 <h3>Comente a nossa not&iacute;cia:</h3>	 	 <form action="/noticias/comente/" method=...
Adicionando comentários           views.pydef adicionaComentario(request):    noticia = get_object_or_404(Noticia, pk=requ...
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...
GET x POST• O método GET apresenta problemas de  privacidade e tem uma limitação de até 256  caracteres (limite do tamanho...
Modificando o nossoformulário para usar POST• Django acrescenta algumas verificações de  segurança para utilização de formul...
Modificando o template<form action="/noticias/comente/" method="POST">	 {% csrf_token %}	 <input type="hidden" name="notici...
Modificando o views.pyfrom django.template import RequestContextdef detalhe(request, noticia_id):    noticia = get_object_o...
Desafio• Adicione os campos autor e data de  publicação aos comentários;• Exiba os comentários ordenados pela data  de publ...
models.pyclass Comentario(models.Model):    noticia         = models.ForeignKey(Noticia)    autor           = models.CharF...
detalhe.html...<form action="/noticias/comente/" method="POST">	 {% csrf_token %}	 <input type="hidden" name="noticia_id" ...
views.pydef detalhe(request, noticia_id):    noticia = get_object_or_404(Noticia, pk=noticia_id)    comentarios = noticia....
Formatos de          data e hora• Visitem a página: • http://docs.djangoproject.com/en/dev/ref/    templates/builtins/• Pr...
Desafio• Utilizem os conceitos aprendidos e implementem  um blog;• Dica: • http://pypi.python.org/pypi/django-tinymce/
Upcoming SlideShare
Loading in...5
×

Python 07

1,010

Published on

Um pouco mais de Django

Published in: Technology
0 Comments
1 Like
Statistics
Notes
  • Be the first to comment

No Downloads
Views
Total Views
1,010
On Slideshare
0
From Embeds
0
Number of Embeds
0
Actions
Shares
0
Downloads
43
Comments
0
Likes
1
Embeds 0
No embeds

No notes for slide
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • Python 07

    1. 1. DjangoEntendendo Melhor Bruno Gama Catão
    2. 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. 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. 4. Como Django gera as páginas ?
    5. 5. Usuario urls.py views.py Templates index( ) cadastro( ) Arquivos listar( ) Estáticos Banco de models.py Dados
    6. 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. 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. 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. 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. 10. Fazendo upload de arquivos• Django possui dois tipos de dados que podem ser utilizados para manipular arquivos: • models.FileField; • models.ImageField.
    11. 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. 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. 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. 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. 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. 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. 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. 18. Adicionando comentários views.pydef 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. 19. Modificando o urls.py(r^comente/$, adicionaComentario),
    20. 20. Testando• Adicione alguns comentários às suas notícias e veja se está tudo correndo bem.
    21. 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. 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. 23. Modificando o nossoformulá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. 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. 25. Modificando o views.pyfrom django.template import RequestContextdef 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. 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. 27. models.pyclass 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. 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. 29. views.pydef 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. 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. 31. Desafio• Utilizem os conceitos aprendidos e implementem um blog;• Dica: • http://pypi.python.org/pypi/django-tinymce/
    1. A particular slide catching your eye?

      Clipping is a handy way to collect important slides you want to go back to later.

    ×