Python 07
Upcoming SlideShare
Loading in...5
×
 

Python 07

on

  • 1,116 views

Um pouco mais de Django

Um pouco mais de Django

Statistics

Views

Total Views
1,116
Slideshare-icon Views on SlideShare
1,116
Embed Views
0

Actions

Likes
1
Downloads
36
Comments
0

0 Embeds 0

No embeds

Accessibility

Categories

Upload Details

Uploaded via as Apple Keynote

Usage Rights

© All Rights Reserved

Report content

Flagged as inappropriate Flag as inappropriate
Flag as inappropriate

Select your reason for flagging this presentation as inappropriate.

Cancel
  • Full Name Full Name Comment goes here.
    Are you sure you want to
    Your message goes here
    Processing…
Post Comment
Edit your comment
  • \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 Python 07 Presentation Transcript

  • DjangoEntendendo 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.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)
  • 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 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.
  • 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.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)
  • 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.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
  • 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.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))
  • 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/