$30 off During Our Annual Pro Sale. View Details »

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. Django
    Class-Based Views
    O que são e por que usá-las
    @CaioWCC
    www.caiocarrara.com.br

    View Slide

  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

    View Slide

  3. Mas primeiro...
    quem é esse cara?

    View Slide

  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

    View Slide

  5. Não me envolvo com
    Java há 5 meses!!

    View Slide

  6. Vamos ao que
    interessa...

    View Slide

  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

    View Slide

  8. FBV
    Function-based views

    View Slide

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

    View Slide

  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

    View Slide

  11. CBV
    Class-based views

    View Slide

  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

    View Slide

  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

    View Slide

  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

    View Slide

  15. Generic CBV
    GCBV

    View Slide

  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

    View Slide

  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

    View Slide

  18. from django.views import generic
    from .models import Product
    class ProductDetailView(generic.DetailView):
    model = Product
    template_name = 'products/detail.html'
    Generic CBV

    View Slide

  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

    View Slide

  20. ● View
    ● TemplateView
    ● RedirectView
    ● DetailView
    ● ListView
    ● FormView
    ● CreateView
    ● UpdateView
    ● DeleteView
    Built-in Generic CBV
    ● ArchiveIndexView
    ● YearArchiveView
    ● MonthArchiveView
    ● WeekArchiveView
    ● DayArchiveView
    ● TodayArchiveView
    ● DateDetailView

    View Slide

  21. CBV
    Vantagens

    View Slide

  22. #1 - Melhora
    expressividade do
    código

    View Slide

  23. Generic CBV
    #views.py
    from django.views import generic
    class FaqTemplateView(generic.TemplateView):
    http_method_names = ['get']
    template_name = 'core/faq.html'

    View Slide

  24. #2 - Melhora a
    organização do
    código

    View Slide

  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):
    {...}

    View Slide

  26. #3 - Herança de
    Views

    View Slide

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

    View Slide

  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): {...}

    View Slide

  29. #4 - Maior SoC*
    *Separation of Concerns

    View Slide

  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): {...}

    View Slide

  31. Built-in CBV
    Desvantagem

    View Slide

  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

    View Slide

  33. Hierarquia Django

    View Slide

  34. Built-in CBV
    Alternativa

    View Slide

  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...

    View Slide

  36. Hierarquia Vanilla

    View Slide

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

    View Slide

  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/

    View Slide