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

May 10, 2012
Tweet

More Decks by Moscow Python Meetup

Other Decks in Programming

Transcript

  1. "Джанго  сделал  для  гитары  больше,  чем   кто-­‐либо  в  джазе.

     Его  стиль  игры  был  не   похож  ни  на  один  другой,  благодаря  ему   джаз  стал  другим.  Будет  еще  много   выдающихся  гитаристов,  но  никогда  не   будет  другого  Рейнхарда.  Я  просто   уверен  в  этом".   Стефан  Грапелли,  1954  
  2. 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  
  3. class  MeetupUpdateView(UpdateView):        model  =  Meetup    

       template_name  =  ‘meetup.html’        form_class  =  MeetupForm        success_url  =  ‘/thanks/’   Class  Based  
  4. Class  Based  Views: •   TemplateView •   ListView •   DetailView • 

     CreateView   •   UpdateView   •   DeleteView   •   RedirectView   •  YearArchiveView,  MonthArchiveView,             WeekArchiveView,  DayArchiveView,   TodayArchiveView
  5. 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   Реализация  
  6. 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'   Реализация  
  7. 3  основных  требования  к  view  в  Django:     • 

     Должны  быть  callable  объектом     •   Должны  принимать  НNpRequest   •   Должны  возвращать  HNpResponse  
  8. #  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”),   )  
  9. @classonlymethod   def  as_view(cls,  **initkwargs):        def  view(request,

     *args,  **kwargs):                self  =  cls(**initkwargs)                return  self.dispatch(request,  *args,  **kwargs)        return  view  
  10.        @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)  
  11.        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)  
  12. 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)  
  13. 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  запросов:  
  14. Полезные  ссылки:     • 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