Class based views

             keeping your code classy
So, What is a view?
So, What is a view?
from django.http import HttpResponse

def current_datetime(request):
    html = "<html><h1>Hello, Django Cali!!!!!.</h1></html>" 
    return HttpResponse(html)

URLconf

Et voilà, a Web response magically appeared!
Class-Based Views
not a function, an object!
                         (and all that it implies)
Class-Based Views
code related to specific HTTP methods (GET, POST, etc.) addressed by separate methods instead of conditional branching.
Class-Based Views
code related to specific HTTP methods (GET, POST, etc.) addressed by separate methods instead of conditional branching.
def current_datetime(request):
    if request.method == 'GET':
        do_something()
    elif request.method == 'POST':
        do_something_else()
from django.views.generic import View

class MyView(View):

    def get(self, request, *args, **kwargs):
        do_something()
    def post(self, request, *args, **kwargs):
        do_something_else()
FROM
TO
Stay classy!
Class-Based Views
Object oriented techniques such as mixins (multiple inheritance) can be used to factor code into reusable components!!!!!!
Remember Django's philosophy,Don’t repeat yourself!
Class-Based Views
Object oriented techniques such as mixins (multiple inheritance) can be used to factor code into reusable components!!!!!!
from djangocali.models import Attendee

def DjangoCaliAttendeeDetail(request, *args, **kwargs):
    if request.method == 'GET':
        if not request.user.is_authenticated():
            return HttpResponseForbidden()
        ateendee_slug = kwargs['slug']
        object = Attendee.objects.get(slug=ateendee_slug)
        context = do_something(object)
        return render(request, 'attendee_detail.html', context)
Class-Based Views
Object oriented techniques such as mixins (multiple inheritance) can be used to factor code into reusable components!!!!!!
from django.views.generic import View
from django.views.generic.detail import SingleObjectMixin
from djangocali.models import Attendee

class DjangoCaliAttendeeDetail(SingleObjectMixin, View):
    """shows the information about the requested Attendee"""
    model = Attendee

    def get(self, request, *args, **kwargs):
        if not request.user.is_authenticated():
            return HttpResponseForbidden()

        # Look up the Attendee that is related to the request.
        self.object = self.get_object()
        context = do_something(self.object)

        return render(request, 'attendee_detail.html', context)
Class-Based Views
Another object oriented technique:
subclassing and overriding attributes and methods in
the subclass
from django.http import HttpResponse
from django.views.generic import View

class GreetingView(View):
    greeting = "Good Day"

    def get(self, request):
        return HttpResponse(self.greeting)


class MorningGreetingView(GreetingView):
    greeting = "Morning to ya"

## another option

urlpatterns = [
    url(r'^about/', GreetingView.as_view(greeting="G'day")),
]
Class-Based Views
General usage
URL dispatcher
view
class-based
 view
from django.conf.urls import url

from . import views

urlpatterns = [
    url(r'^djangocali/attendee/$',
        views.attendee_view),
    url(r'^djangocali/history/$',
        views.history_view),
    url(r'^djangocali/someurl/$',
        views.some_view),
]
from django.conf.urls import url

from . import views

urlpatterns = [
    url(r'^djangocali/attendee/$',
        views.AttendeeView.as_view()),
    url(r'^djangocali/history/$',
        views.HistoryView.as_view()),
    url(r'^djangocali/someurl/$',
        views.SomeView.as_view()),
]
Class-Based Views
General usage
URL dispatcher
class-based
 view
from django.conf.urls import url

from . import views

urlpatterns = [
    url(r'^djangocali/attendee/$',
        views.AttendeeView.as_view()),
    url(r'^djangocali/history/$',
        views.HistoryView.as_view()),
    url(r'^djangocali/someurl/$',
        views.SomeView.as_view()),
]
.as_view creates an instance of your class and calls its dispatch() method.
dispatch looks at the request to determine whether it is a GET, POST, etc, and relays the request to a matching method if one is defined, or raises HttpResponseNotAllowed if not
Class-Based Views
General usage
Decorators
In the URLconf
In the definition
from django.utils.decorators import\ 
method_decorator
from django.views.generic import View
from django.views.decorators.cache import\ 
cache_page

class SomeView(View):
    @method_decorator(cache_page(5))
    def dispatch(self, *args, **kwargs):
        return super(
        SomeView, self).dispatch(*args,**kwargs)

// other option, decorate the class itself 
// at name you can define the method to decorate

@method_decorator(cache_page(5),name='dispatch')
class SomeView(View):
from django.conf.urls import url
from django.views.decorators.cache import\
cache_page
from . import views

urlpatterns = [
    url(r'^djangocali/attendee/$',
        views.AttendeeView.as_view()),
    url(r'^djangocali/history/$',
        views.HistoryView.as_view()),
    url(r'^djangocali/someurl/$',
      cache_page(5)(views.SomeView.as_view())),
]
Some Class-Based Views
from django.http import HttpResponse
from django.views.generic import View, TemplateView
from djangocali.models import Attendee

class SomeView(View):

    def get(self, request, *args, **kwargs):
        html = "<html><h1>Hello, \
                Django Cali!!!!!.</h1></html>"
        return HttpResponse(html)


class AttendeeView(TemplateView):

    template_name = "Attendee.html"

    def get_context_data(self, **kwargs):
        context = super(AttendeeViewView,
                        self).get_context_data(**kwargs)
        context['attendees'] = Attendee.objects.all()
        return context
from django.views.generic.edit import UpdateView,CreateView
from django.views.generic.edit import DeleteView
from django.core.urlresolvers import reverse_lazy
from djangocali.models import Attendee

class AttendeeCreateView(CreateView):
    model = Attendee
    fields = ['name','email']


class AttendeeUpdateView(UpdateView):
    model = Attendee
    fields = ['email']
    template_name_suffix = '_update_form'


class AttendeeDeleteView(DeleteView):
    model = Attendee
    success_url = reverse_lazy('home')
    def get_object(self, queryset=None):
        obj =Attendee.objects.get(uuid=self.kwargs['uuid'])
        return obj
Some Class-Based Views
from django.views.generic.edit import UpdateView,CreateView
from django.views.generic.edit import DeleteView
from django.core.urlresolvers import reverse_lazy
from djangocali.models import Attendee

class AttendeeCreateView(CreateView):
    model = Attendee
    fields = ['name','email']


class AttendeeUpdateView(UpdateView):
    model = Attendee
    fields = ['email']
    template_name_suffix = '_update_form'


class AttendeeDeleteView(DeleteView):
    model = Attendee
    success_url = reverse_lazy('home')
    def get_object(self, queryset=None):
        obj =Attendee.objects.get(uuid=self.kwargs['uuid'])
        return obj



<!--CreateView html example-->

<form action="" method="post">{% csrf_token %}
    {{ form.as_p }}
    <input type="submit" value="Create" />
</form>

<!--UpdateView html example-->

<form action="" method="post">{% csrf_token %}
    {{ form.as_p }}
    <input type="submit" value="Update" />
</form>


<!--Delete html example-->

<form action="" method="post">{% csrf_token %}
    <p>Are you sure you want to delete "{{ object }}"?</p>
    <input type="submit" value="Confirm" />
</form>
And more Class-Based Views!!
https://ccbv.co.uk/
https://docs.djangoproject.com/en/1.8/ref/class-based-views/
Need more info?
Questions?

classbasedviews

By Jose Ariza

classbasedviews

  • 1,561