django class based views for beginners

48
Django Class-based Views for Beginners Spin Lai

Upload: spin-lai

Post on 15-Apr-2017

532 views

Category:

Software


19 download

TRANSCRIPT

Page 1: Django class based views for beginners

Django Class-based Viewsfor Beginners

Spin Lai

Page 2: Django class based views for beginners

Function-based View

Page 3: Django class based views for beginners

Function-based View

What is Function-based View?

▸ A Django views is a function that :

▸ Take an HTTP request as the input

▸ Turn it into a HTTP response

▸ a.k.a Function-based Views (FBVs)

Page 4: Django class based views for beginners

Function-based View

View Functions

Page 5: Django class based views for beginners

Function-based View

View Functions

Page 6: Django class based views for beginners

Function-based View

How does it work?

Request

Django FBV

post_list() Response

Page 7: Django class based views for beginners

Class-based View

Page 8: Django class based views for beginners

Class-based View

What is Class-based View?

▸ Django views based on class

▸ Actually called as Function

▸ Using mixins to add functionality

Page 9: Django class based views for beginners

Class-based View

What does it look like?

Page 10: Django class based views for beginners

Class-based View

How does it work?

Request

Django CBV

as_view()

dispatch()

get() / post() / put() …

Response

Page 11: Django class based views for beginners

Mixins

Page 12: Django class based views for beginners

Mixins

Image source : http://atwinkyaday.blogspot.tw/2012_12_01_archive.html

Page 13: Django class based views for beginners

Mixins

Flavour

Image source : http://thebakingbird.com/ice-cream/humphry-slocombe-the-hipster-ice-cream-parlor-of-ice-cream-parlors/

Page 14: Django class based views for beginners

Mixins

+Flavour

Mix-insImage source : http://coldstoneofaberdeen.com/ice-cream/mix-go/

Page 15: Django class based views for beginners

Mixins

+ =Flavour

Mix-insImage source : http://www.thecomfortofcooking.com/2014/04/amazing-no-churn-ice-cream-6-flavors.html

Page 16: Django class based views for beginners

Mixins

What is Mixin in Python?

▸ Actually, mixins are ordinary Python classes

▸ Provides functionality to be inherited

▸ But isn’t meant to be instantiated on its own

Page 17: Django class based views for beginners

Mixins

Why?

▸ Adding functionality to classes

▸ Improve modularity

Page 18: Django class based views for beginners

Mixins

When to use?

▸ Reuse code / features across multiple classes

Page 19: Django class based views for beginners

Mixins

Rule of thumb

▸ Base view classes provided by Django always go to the right.

▸ Mixins go to the left of the base view.

▸ Mixins should inherit from Python’s built-in object type

▸ Keep shallow inheritance chain

Page 20: Django class based views for beginners

Mixins - Rule of thumb

Base view classes provided by Django always go to the right

Page 21: Django class based views for beginners

Mixins - Rule of thumb

Mixins go to the left of the base view

Page 22: Django class based views for beginners

Mixins - Rule of thumb

Mixins should inherit from Python’s built-in object type

Page 23: Django class based views for beginners

Built-in Class-based Generic Views

Page 24: Django class based views for beginners

Built-in Class-based Generic Views

Category of Built-in Class-based Generic Views

▸ Base

▸ List

▸ Detail

▸ Edit

Page 25: Django class based views for beginners

Built-in Class-based Generic Views

Base Generic Views

▸ django.views.generic.View

▸ django.views.generic.TemplateView

▸ django.views.generic.RedirectView

Page 26: Django class based views for beginners

Built-in Class-based Generic Views

List Generic Views

▸ django.views.generic.list.ListView

Page 27: Django class based views for beginners

Built-in Class-based Generic Views

Detail Generic Views

▸ django.views.generic.detail.DetailView

Page 28: Django class based views for beginners

Built-in Class-based Generic Views

Edit Generic Views

▸ django.views.generic.FormView

▸ django.views.generic.CreateView

▸ django.views.generic.UpdateView

▸ django.views.generic.DeleteView

Page 29: Django class based views for beginners

Usage of CBVs

Page 30: Django class based views for beginners

Usage of CBVs

TemplateView

Page 31: Django class based views for beginners

Usage of CBVs

ListView

Page 32: Django class based views for beginners

Usage of CBVs

CreateView

Page 33: Django class based views for beginners

CBVs and Mixins

Page 34: Django class based views for beginners

CBVs and Mixins

TemplateView

TemplateView

View ContextMixin TemplateResponseMixin

Page 35: Django class based views for beginners

CBVs and Mixins

ListView

ListView

View TemplateResponseMixin

ContextMixin

MultipleObjectMixin

BaseListView MutipleObjectTemplateResponseMixin

Page 36: Django class based views for beginners

CBVs and Mixins

DetailView

DetailView

View TemplateResponseMixin

ContextMixin

SingleObjectMixin

BaseDetailView SingleObjectTemplateResponseMixin

Page 37: Django class based views for beginners

CBVs and Mixins

FormView

FormView

ProcessFormView

TemplateResponseMixin

ContextMixin

FormMixin

BaseFormView

View

Page 38: Django class based views for beginners

The Dark Side

Page 39: Django class based views for beginners

The Dark Side

The Dark Side of Mixins

▸ Easy to lose track of the origin of your methods

▸ You may actually polluting the class namespace

Page 40: Django class based views for beginners

The Dark Side

The Dark Side of Generic CBVs

▸ Flow control is totally hidden

▸ The order of execution may not be obvious to anyone else

▸ More difficult to debug

▸ To understand what’s going on. You have to read the API docs, or even the source code of CBVs …

▸ Remember? “Explicit is better than implicit”

Page 41: Django class based views for beginners

Demo

Page 42: Django class based views for beginners

Takeaways

Page 43: Django class based views for beginners

Takeaways

FBVs or CBVs ?

▸ Does the Generic CBVs closely match what you need?

▸ Can you use a CBV just by overriding some attributes?

▸ Do you need to subclass your views to create some views?

Page 44: Django class based views for beginners

Takeaways

Guidelines

▸ Keep your view simple

▸ Never repeat code in your views

▸ Only handle presentation logic in views

▸ Keep your mixins simpler

▸ Don’t use CBVs to write 403, 404… error handlers. Use FBVs instead

Page 45: Django class based views for beginners

Resources

Page 46: Django class based views for beginners

Resources

Links

▸ https://docs.djangoproject.com/ja/1.9/topics/class-based-views/

▸ https://ccbv.co.uk/

▸ http://django-vanilla-views.org/

Page 47: Django class based views for beginners

Resources

Books

▸ 「Two Scoops of Django: Best Practices for Django 1.8」

▸ Chap 8 Function-and-Class-Based Views

▸ Chap 9 Best Practices for Function-Based Views

▸ Chap 10 Best Practices for Class-Based Views

Page 48: Django class based views for beginners

Thank you