django além do admin
DESCRIPTION
Apresentação "Django além do admin", realizado no ciclo de apresentações internas da Giran (Giran Siege).Mais detalhes sobre o Giran Siege: http://blog.giran.com.br/2010/09/giran-siege-palestras-internas-da-giran/TRANSCRIPT
![Page 1: Django além do admin](https://reader034.vdocuments.site/reader034/viewer/2022050722/54b6caf14a7959a91b8b45ba/html5/thumbnails/1.jpg)
O Django é o “framework web para perfeccionistas com prazos”...
... e o seu principal recurso é o Django Admin.
Esse cara ta me zoando...
![Page 2: Django além do admin](https://reader034.vdocuments.site/reader034/viewer/2022050722/54b6caf14a7959a91b8b45ba/html5/thumbnails/2.jpg)
http://2.bp.blogspot.com/_WHZ6KCOzbjE/S-qISN_FKuI/AAAAAAAABq4/Np0J_Vsf_vk/s1600/RafikisWords.jpg
Além do que seus olhos podem ver!
![Page 4: Django além do admin](https://reader034.vdocuments.site/reader034/viewer/2022050722/54b6caf14a7959a91b8b45ba/html5/thumbnails/4.jpg)
http://www.flickr.com/photos/41460120@N04/4217783923/
Quer dizer que o admin não é o
principal recurso do Django?!
Não é bem assim, mano...
![Page 5: Django além do admin](https://reader034.vdocuments.site/reader034/viewer/2022050722/54b6caf14a7959a91b8b45ba/html5/thumbnails/5.jpg)
http://www.flickr.com/photos/villes/1348742988/
![Page 6: Django além do admin](https://reader034.vdocuments.site/reader034/viewer/2022050722/54b6caf14a7959a91b8b45ba/html5/thumbnails/6.jpg)
http://www.flickr.com/photos/desiitaly/2201907500/
então
qual é
![Page 7: Django além do admin](https://reader034.vdocuments.site/reader034/viewer/2022050722/54b6caf14a7959a91b8b45ba/html5/thumbnails/7.jpg)
O principal recurso do Django é o mais fundamental
para a sua aplicação
![Page 8: Django além do admin](https://reader034.vdocuments.site/reader034/viewer/2022050722/54b6caf14a7959a91b8b45ba/html5/thumbnails/8.jpg)
Conheça os recursos!
![Page 9: Django além do admin](https://reader034.vdocuments.site/reader034/viewer/2022050722/54b6caf14a7959a91b8b45ba/html5/thumbnails/9.jpg)
![Page 10: Django além do admin](https://reader034.vdocuments.site/reader034/viewer/2022050722/54b6caf14a7959a91b8b45ba/html5/thumbnails/10.jpg)
class Product(models.Model): name = models.CharField(max_length=200) description = models.TextField() price = models.FloatField() creation_date = models.DateField(auto_now_add=True) last_modification_date = models.DateField(auto_now=True) hidden = models.BooleanField(default=False) image = models.ImageField(upload_to='images/products', max_length=200)
![Page 11: Django além do admin](https://reader034.vdocuments.site/reader034/viewer/2022050722/54b6caf14a7959a91b8b45ba/html5/thumbnails/11.jpg)
Salvando objetosdef new_product(request): """Renders a product form on GET requests and saves a product on POST requests""" form = ProductForm() if request.method == 'POST': form = ProductForm(request.POST, request.FILES) if form.is_valid(): form.save() return HttpResponse('Product saved.')
return render_to_response('product_form.html', { 'form' : form }, context_instance=RequestContext(request) )
![Page 12: Django além do admin](https://reader034.vdocuments.site/reader034/viewer/2022050722/54b6caf14a7959a91b8b45ba/html5/thumbnails/12.jpg)
urls.py
urlpatterns = patterns('', (r'^new_product', 'views.new_product'),)
![Page 13: Django além do admin](https://reader034.vdocuments.site/reader034/viewer/2022050722/54b6caf14a7959a91b8b45ba/html5/thumbnails/13.jpg)
E se for outro model?def new_product(request): """Renders a product form on GET requests and saves a product on POST requests""" form = ProductForm() if request.method == 'POST': form = ProductForm(request.POST, request.FILES) if form.is_valid(): form.save() return HttpResponse('Product saved.')
return render_to_response('product_form.html', { 'form' : form }, context_instance=RequestContext(request) )
![Page 14: Django além do admin](https://reader034.vdocuments.site/reader034/viewer/2022050722/54b6caf14a7959a91b8b45ba/html5/thumbnails/14.jpg)
E se for outro model?def new_category(request): """Renders a category form on GET requests and saves a category on POST requests""" form = CategoryForm() if request.method == 'POST': form = CategoryForm(request.POST, request.FILES) if form.is_valid(): form.save() return HttpResponse('Category saved.')
return render_to_response('category_form.html', { 'form' : form }, context_instance=RequestContext(request) )
![Page 15: Django além do admin](https://reader034.vdocuments.site/reader034/viewer/2022050722/54b6caf14a7959a91b8b45ba/html5/thumbnails/15.jpg)
Que tal outro?def new_customer(request): """Renders a customer form on GET requests and saves a customer on POST requests""" form = CustomerForm() if request.method == 'POST': form = CustomerForm(request.POST, request.FILES) if form.is_valid(): form.save() return HttpResponse('Customer saved.')
return render_to_response('customer_form.html', { 'form' : form }, context_instance=RequestContext(request) )
![Page 16: Django além do admin](https://reader034.vdocuments.site/reader034/viewer/2022050722/54b6caf14a7959a91b8b45ba/html5/thumbnails/16.jpg)
http://abhinavpmp.com/wp-content/uploads/repetition.jpg
Don't repeat yourself!
![Page 17: Django além do admin](https://reader034.vdocuments.site/reader034/viewer/2022050722/54b6caf14a7959a91b8b45ba/html5/thumbnails/17.jpg)
http://abhinavpmp.com/wp-content/uploads/repetition.jpg
Don't repeat yourself!
I don't yourself?!
![Page 18: Django além do admin](https://reader034.vdocuments.site/reader034/viewer/2022050722/54b6caf14a7959a91b8b45ba/html5/thumbnails/18.jpg)
Generic views
urlpatterns = patterns('', (r'^new_product', 'django.views.generic.create_update.create_object', { 'model' : Product, 'post_save_redirect' : '/products/', 'template_name' : 'product_form.html' }),)
![Page 19: Django além do admin](https://reader034.vdocuments.site/reader034/viewer/2022050722/54b6caf14a7959a91b8b45ba/html5/thumbnails/19.jpg)
http://bit.ly/generic-views
![Page 20: Django além do admin](https://reader034.vdocuments.site/reader034/viewer/2022050722/54b6caf14a7959a91b8b45ba/html5/thumbnails/20.jpg)
Autenticação
LOGIN_URL = '/login/'
LOGIN_REDIRECT_URL = '/'
![Page 21: Django além do admin](https://reader034.vdocuments.site/reader034/viewer/2022050722/54b6caf14a7959a91b8b45ba/html5/thumbnails/21.jpg)
Autenticação
def say_hello(request): """Says Hello world on GET requests""" return HttpResponse('Hello world!')
![Page 22: Django além do admin](https://reader034.vdocuments.site/reader034/viewer/2022050722/54b6caf14a7959a91b8b45ba/html5/thumbnails/22.jpg)
Autenticação
@login_requireddef say_hello(request): """Says Hello world on GET requests""" return HttpResponse('Hello world!')
![Page 23: Django além do admin](https://reader034.vdocuments.site/reader034/viewer/2022050722/54b6caf14a7959a91b8b45ba/html5/thumbnails/23.jpg)
Django Forms
class ProductForm(forms.Form): name = forms.CharField(max_length=200) description = forms.TextField() price = forms.FloatField() hidden = forms.BooleanField(default=False) image = forms.ImageField(upload_to='images/products', max_length=200)
![Page 24: Django além do admin](https://reader034.vdocuments.site/reader034/viewer/2022050722/54b6caf14a7959a91b8b45ba/html5/thumbnails/24.jpg)
Django Model Forms
class ProductForm(forms.ModelForm): class Meta: model = Product
![Page 25: Django além do admin](https://reader034.vdocuments.site/reader034/viewer/2022050722/54b6caf14a7959a91b8b45ba/html5/thumbnails/25.jpg)
Validação sem dor
class ContactForm(forms.Form): name = forms.CharField(max_length=150) email = forms.EmailField(max_length=75) message = forms.TextField()
![Page 26: Django além do admin](https://reader034.vdocuments.site/reader034/viewer/2022050722/54b6caf14a7959a91b8b45ba/html5/thumbnails/26.jpg)
http://bit.ly/django-felds
![Page 27: Django além do admin](https://reader034.vdocuments.site/reader034/viewer/2022050722/54b6caf14a7959a91b8b45ba/html5/thumbnails/27.jpg)
Localização
class ContactForm(forms.Form): name = forms.CharField(max_length=150) email = forms.EmailField(max_length=75) cpf = BRCPFField() message = forms.CharField(widget=forms.Textarea)
![Page 28: Django além do admin](https://reader034.vdocuments.site/reader034/viewer/2022050722/54b6caf14a7959a91b8b45ba/html5/thumbnails/28.jpg)
Localização
class ContactForm(forms.Form): name = forms.CharField(max_length=150) email = forms.EmailField(max_length=75) cpf = BRCPFField() message = forms.CharField(widget=forms.Textarea)
Valida CPF?! :O
![Page 29: Django além do admin](https://reader034.vdocuments.site/reader034/viewer/2022050722/54b6caf14a7959a91b8b45ba/html5/thumbnails/29.jpg)
http://bit.ly/django-l10n
![Page 30: Django além do admin](https://reader034.vdocuments.site/reader034/viewer/2022050722/54b6caf14a7959a91b8b45ba/html5/thumbnails/30.jpg)
Enviando e-mail
class ContactForm(forms.Form): name = forms.CharField(max_length=150) email = forms.EmailField(max_length=75) cpf = BRCPFField() message = forms.CharField(widget=forms.Textarea)
def send_email(self): msg = "Hi, I'm %(name)s. My message for you: %(message)s. My CPF is %(cpf)s." % self.cleaned_data send_mail('Contact', msg, self.cleaned_data['email'], ['[email protected]'], fail_silently=True)
![Page 31: Django além do admin](https://reader034.vdocuments.site/reader034/viewer/2022050722/54b6caf14a7959a91b8b45ba/html5/thumbnails/31.jpg)
django.core.mail.send_mail
EMAIL_HOST = 'smtp.voce.com'EMAIL_HOST_USER = '[email protected]'EMAIL_HOST_PASSWORD = 'senha123'EMAIL_PORT = 25EMAIL_USE_TLS = False
![Page 32: Django além do admin](https://reader034.vdocuments.site/reader034/viewer/2022050722/54b6caf14a7959a91b8b45ba/html5/thumbnails/32.jpg)
Enviando e-mail
def contact(request): """Renders a contact form on GET requests and sends an email on POST requests""" form = ContactForm() if request.method == 'POST': form = ContactForm(request.POST) if form.is_valid(): form.send_email() return HttpResponse("Mail sent.") return render_to_response('contact_form.html', { 'form' : form }, context_instance=RequestContext(request) )
![Page 33: Django além do admin](https://reader034.vdocuments.site/reader034/viewer/2022050722/54b6caf14a7959a91b8b45ba/html5/thumbnails/33.jpg)
Test client
django.test.client.Client
from django.test.client import Client
client = Client()response = client.get('/contact/')assert 'Name' in response.content
![Page 34: Django além do admin](https://reader034.vdocuments.site/reader034/viewer/2022050722/54b6caf14a7959a91b8b45ba/html5/thumbnails/34.jpg)
http://bit.ly/django-testing
![Page 35: Django além do admin](https://reader034.vdocuments.site/reader034/viewer/2022050722/54b6caf14a7959a91b8b45ba/html5/thumbnails/35.jpg)
http://www.flickr.com/photos/jkonig/2056057464/
Chega!
![Page 36: Django além do admin](https://reader034.vdocuments.site/reader034/viewer/2022050722/54b6caf14a7959a91b8b45ba/html5/thumbnails/36.jpg)
Antes de terminarmos...
![Page 37: Django além do admin](https://reader034.vdocuments.site/reader034/viewer/2022050722/54b6caf14a7959a91b8b45ba/html5/thumbnails/37.jpg)
Signals
pre_save
post_save
pre_delete
post_delete
request_started
request_fnished
![Page 38: Django além do admin](https://reader034.vdocuments.site/reader034/viewer/2022050722/54b6caf14a7959a91b8b45ba/html5/thumbnails/38.jpg)
http://bit.ly/django-signals
![Page 39: Django além do admin](https://reader034.vdocuments.site/reader034/viewer/2022050722/54b6caf14a7959a91b8b45ba/html5/thumbnails/39.jpg)
Tem mais?!
![Page 40: Django além do admin](https://reader034.vdocuments.site/reader034/viewer/2022050722/54b6caf14a7959a91b8b45ba/html5/thumbnails/40.jpg)
djangoproject.com