Upgrade to Pro — share decks privately, control downloads, hide ads and more …

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.

Caio Carrara

June 13, 2015
Tweet

More Decks by Caio Carrara

Other Decks in Technology

Transcript

  1. • 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
  2. @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
  3. • 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
  4. #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
  5. #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
  6. #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
  7. • 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
  8. • 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
  9. #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
  10. #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
  11. • View • TemplateView • RedirectView • DetailView • ListView

    • FormView • CreateView • UpdateView • DeleteView Built-in Generic CBV • ArchiveIndexView • YearArchiveView • MonthArchiveView • WeekArchiveView • DayArchiveView • TodayArchiveView • DateDetailView
  12. 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): {...}
  13. from django.views import generic from .forms import ProductForm from .models

    import Product class ProductFormMixin(object): model = Product form_class = ProductForm Generic CBV
  14. 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): {...}
  15. 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): {...}
  16. • 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
  17. 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...
  18. 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/