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

Class-based generic views в Django

Class-based generic views в Django

Александр Емелин

Тем кто до сих пор не пользуется вьюхами на классах, рекомендуем обратить на них внимание, порой они экономят очень много boilerplate-кода. Тем же, кто активно их применяет, неплохая ссылочка по рекомендации Александра: Classy CBV - замена официальной путаной и неудобной документации по видам на классах. Доставило обсуждение CBV vs functional views, когда уместно использовать тот или иной вариант и почему.

Moscow Python Meetup
PRO

May 10, 2012
Tweet

More Decks by Moscow Python Meetup

Other Decks in Programming

Transcript

  1. "Джанго  сделал  для  гитары  больше,  чем  
    кто-­‐либо  в  джазе.  Его  стиль  игры  был  не  
    похож  ни  на  один  другой,  благодаря  ему  
    джаз  стал  другим.  Будет  еще  много  
    выдающихся  гитаристов,  но  никогда  не  
    будет  другого  Рейнхарда.  Я  просто  
    уверен  в  этом".  
    Стефан  Грапелли,  1954  

    View Slide

  2. Class  Based  Generic  Views  
    Django  meetup  3  

    View Slide

  3. def  meetup_edit(request,  pk):  
         meetup  =  get_object_or_404(Meetup,  pk  =  pk)  
         if  request.method  ==  'POST':    
                 form  =  MeetupForm(request.POST,  request.FILES)  
                 if  form.is_valid():  
                         form.save()  
                         return  HKpResponseRedirect('/thanks/')  
                 else:  
                         return  render_to_response('meetup.html',  {'form':  form})  
         else:  
                 form  =  MeetupForm(instance  =  meetup)  
         return  render_to_response('meetup.html',  {'form':  form})  
    FuncQon  Based  

    View Slide

  4. class  MeetupUpdateView(UpdateView):  
         model  =  Meetup  
         template_name  =  ‘meetup.html’  
         form_class  =  MeetupForm  
         success_url  =  ‘/thanks/’  
    Class  Based  

    View Slide

  5. Class  Based  Views:
    •   TemplateView
    •   ListView
    •   DetailView
    •   CreateView  
    •   UpdateView  
    •   DeleteView  
    •   RedirectView  
    •  YearArchiveView,  MonthArchiveView,            
    WeekArchiveView,  DayArchiveView,  
    TodayArchiveView

    View Slide

  6. class  TemplateView(TemplateResponseMixin,  ContextMixin,  View):  
         def  get(self,  request,  *args,  **kwargs):  
                 context  =  self.get_context_data(params  =  kwargs)  
                 return  self.render_to_response(context)  
    class  DetailView(SingleObjectTemplateResponseMixin,  BaseDetailView):  
         pass  
    class  ListView(MulQpleObjectTemplateResponseMixin,BaseListView):  
         pass  
    Реализация  

    View Slide

  7. class  CreateView(SingleObjectTemplateResponseMixin,  BaseCreateView):  
         template_name_suffix  =  '_form'  
     
     
    class  UpdateView(SingleObjectTemplateResponseMixin,  BaseUpdateView):  
         template_name_suffix  =  '_form'  
     
     
    class  DeleteView(SingleObjectTemplateResponseMixin,  BaseDeleteView):  
         template_name_suffix  =  '_confirm_delete'  
    Реализация  

    View Slide

  8. 3  основных  требования  к  view  в  Django:  
     
    •   Должны  быть  callable  объектом  
     
    •   Должны  принимать  НNpRequest  
    •   Должны  возвращать  HNpResponse  

    View Slide

  9. #  urls.py  
    from  django.conf.urls  import  paKerns,  url  
    from  some_app.views  import  AboutView  
     
    urlpaKerns  =  paKerns('',  
         url(r'^/',  AboutView.as_view(),  name=”some_app_about”),  
    )  

    View Slide

  10. @classonlymethod  
    def  as_view(cls,  **initkwargs):  
         def  view(request,  *args,  **kwargs):  
                 self  =  cls(**initkwargs)  
                 return  self.dispatch(request,  *args,  **kwargs)  
         return  view  

    View Slide

  11.        @method_decorator(login_required)  
           def  dispatch(self,  request,  *args,  **kwargs):  
                   handler  =  geta?r(self,  request.method.lower())                
                   self.request  =  request  
                   self.args  =  args  
                   self.kwargs  =  kwargs  
                   return  handler(request,  *args,  **kwargs)  

    View Slide

  12.        def  get(self,  request,  *args,  **kwargs):  
                   context  =  self.get_context_data(params=kwargs)  
                   return  self.render_to_response(context)  
           def  post(self,  request,  *args,  **kwargs):  
                   form_class  =  self.get_form_class()  
                   form  =  self.get_form(form_class)  
                   if  form.is_valid():  
                           return  self.form_valid(form)  
                   else:  
                           return  self.form_invalid(form)  

    View Slide

  13. def  get_context_data(self,  **kwargs):  
                   return  kwargs  
           def  render_to_response(self,  context,  **kw):  
                   return  self.response_class(  
                           request  =  self.request,  
                           template  =  self.get_template_names(),  
                           context  =  context,  
                           **kw)  

    View Slide

  14. SUCCESS!  

    View Slide

  15. h?p://ccbv.co.uk/  

    View Slide

  16. TemplateView  

    View Slide

  17. as_view()    исходный  код  

    View Slide

  18. h?ps://github.com/FZambia/django-­‐class-­‐
    based-­‐vs-­‐funcYon-­‐based  
     
     

    View Slide

  19. Class  Based  View  GET:  
    11.6180129051  
    .  
    Class  Based  View  POST:  
    15.6457400322  
    .  
    FuncYon  Based  View  GET:  
    11.2678151131  
    .  
    FuncYon  Based  View  POST:  
    15.1721260548  
    .  
    -­‐-­‐-­‐-­‐-­‐-­‐-­‐-­‐-­‐-­‐-­‐-­‐-­‐-­‐-­‐-­‐-­‐-­‐-­‐-­‐-­‐-­‐-­‐-­‐-­‐-­‐-­‐-­‐-­‐-­‐-­‐-­‐-­‐-­‐-­‐-­‐-­‐-­‐-­‐-­‐-­‐-­‐-­‐-­‐-­‐-­‐-­‐-­‐-­‐-­‐-­‐-­‐-­‐-­‐-­‐-­‐-­‐-­‐-­‐-­‐-­‐-­‐-­‐-­‐-­‐-­‐-­‐-­‐-­‐-­‐  
    Ran  4  tests  in  56.563s  
    1000  GET  запросов,  1000  POST  запросов:  

    View Slide

  20. Полезные  ссылки:  
     
    • hKps://github.com/django/django/tree/master/django/views/
    generic  
    •   hKp://habrahabr.ru/post/136784/  
    •   hKp://habrahabr.ru/post/137168/  
    •   
    hKp://so…waremaniacs.org/blog/2011/10/06/class-­‐based-­‐
    generic-­‐views/  
    •   hKp://kimavr.name/blog/2011/9/2/7/  
    •   hKps://github.com/brack3t/django-­‐braces    
    •   hKps://github.com/lig/django-­‐supergeneric  
    •   hKps://code.djangoproject.com/Qcket/6735  

    View Slide

  21. View Slide