Django Class-Based Views

Django Class-Based Views

Apresentação feita no encontro do Grupo de Usuários Python de São Paulo, em Junho de 2015. Nessa oportunidade pude falar um pouco sobre o que são as Class-Based Views no Django e quais suas vantagens e desvantagens.

F6d5a605df582ab9ea419ebef9f400b7?s=128

Caio Carrara

June 13, 2015
Tweet

Transcript

  1. Django Class-Based Views O que são e por que usá-las

    @CaioWCC www.caiocarrara.com.br
  2. • Function-based views (FBV) • Class-based views (CBV) • Detalhes

    e vantagens das CBV ◦ Generic Class-based views (GCBV) nativas • Desvantagem das GCBV nativas • Alternativa às GCBV nativas Agenda
  3. Mas primeiro... quem é esse cara?

  4. @CaioWCC @cacarrara • Desenvolvedor de software há 5 anos; •

    Desenvolvendo produtos com Python, Django, Javascript e app mobile cross- device na tegra.me • Aprendiz de professor • Mas mais importante... Caio Carrara
  5. Não me envolvo com Java há 5 meses!!

  6. Vamos ao que interessa...

  7. • Toda view é um callable que recebe como argumento

    um HttpRequest e retorna um HttpResponse • FBV: as próprias funções são os callables • CBV: um método de classe as_view() retorna o callable apropriado Django views
  8. FBV Function-based views

  9. #views.py from django.http import HttpResponse def minha_view(request): return HttpResponse('Hello World

    FBV') FBV - views.py
  10. #urls.py from django.conf.urls import url from core import views urlpatterns

    = [ url(r'^fbv/', views.minha_view, name='minha_fbv'), ] FBV - urls.py
  11. CBV Class-based views

  12. #views.py from django.http import HttpResponse from django.views.generic import View class

    MinhaView(View): def get(self, request, *args, **kwargs): return HttpResponse('Hello World CBV!') CBV - views.py
  13. #urls.py from django.conf.urls import url from core import views urlpatterns

    = [ url(r'^cbv/', views.MinhaView.as_view(), name='minha_cbv' ), ] CBV - urls.py
  14. • Toda CBV deve herdar de django.views. generic.View direta ou

    indiretamente, pois implementa: ◦ as_view() ◦ dispatch() ◦ http_method_not_allowed() ◦ mais... CBV - lembre-se
  15. Generic CBV GCBV

  16. • Assim como o Python, o Django já vem com

    diversas baterias inclusas. Entre elas, suas classes de Views Genéricas; • As classes de Views Genéricas abstraem padrões comuns de implementações geralmente utilizados em uma view Generic CBV
  17. #views.py from django.views import generic from .models import Product class

    ProductListView(generic.ListView): http_method_names = ['get'] template_name = 'products/index.html' model = Product paginate_by = 10 Generic CBV
  18. from django.views import generic from .models import Product class ProductDetailView(generic.DetailView):

    model = Product template_name = 'products/detail.html' Generic CBV
  19. #views.py - sobrescrevendo metodo from django.views import generic from .models

    import Question class IndexView(generic.ListView): {...} def get_queryset(self): return Question.objects.order_by('-pub_date')[:5] Generic CBV
  20. • View • TemplateView • RedirectView • DetailView • ListView

    • FormView • CreateView • UpdateView • DeleteView Built-in Generic CBV • ArchiveIndexView • YearArchiveView • MonthArchiveView • WeekArchiveView • DayArchiveView • TodayArchiveView • DateDetailView
  21. CBV Vantagens

  22. #1 - Melhora expressividade do código

  23. Generic CBV #views.py from django.views import generic class FaqTemplateView(generic.TemplateView): http_method_names

    = ['get'] template_name = 'core/faq.html'
  24. #2 - Melhora a organização do código

  25. Generic CBV from django.views import generic class MinhaView(generic.View): http_method_names =

    ['get', 'post'] def get(self, request, *args, **kwargs): {...} def post(self, request, *args, **kwargs): {...}
  26. #3 - Herança de Views

  27. from django.views import generic from .forms import ProductForm from .models

    import Product class ProductFormMixin(object): model = Product form_class = ProductForm Generic CBV
  28. Generic CBV from django.views import generic from .forms import ProductForm

    from .models import Product {...} class ProductCreateView(ProductFormMixin, generic.CreateView): {...} class ProductUpdateView(ProductFormMixin, generic.UpdateView): {...}
  29. #4 - Maior SoC* *Separation of Concerns

  30. Generic CBV from django.views import generic class MinhaCreateView(generic.CreateView): def get(self,

    request, *args, **kwargs): {...} def post(self, request, *args, **kwargs): {...} def get_context_data(self, *args, **kwargs): {...} def get_form(self, *args, **kwargs): {...} def get_form_kwargs(self, *args, **kwargs): {...} def form_valid(self, *args, **kwargs): {...} def get_form_invalid(self, *args, **kwargs): {...}
  31. Built-in CBV Desvantagem

  32. • CBV nativas do Django desnecessariamente complicadas; • Demasia no

    uso de Mixins; • Separação de responsabilidades muito granular; • "Caos" para saber o que sobrescrever CBV - desvantagem
  33. Hierarquia Django

  34. Built-in CBV Alternativa

  35. Django Vanilla Views • Projeto da comunidade (github) • Oferece

    as mesmas funcionalidades das CBV nativas, porém de forma "sã": ◦ Sem mixins, ◦ Sem chamadas super(), ◦ Uma hierarquia de classes simplificada, ◦ mais...
  36. Hierarquia Vanilla

  37. Prefira usar Class- Based Views Built-in ou Vanilla Obrigado!

  38. Créditos • Documentação Django oficial - https://docs.djangoproject. com • Two

    Scoops of Django - by Daniel Greenfeld and Audrey Roy ◦ http://twoscoopspress.com/products/two-scoops-of-django-1-8 • Django Vanilla Views - http://django-vanilla-views.org/ • Syntax Highlighter - http://markup.su/highlighter/