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, когда уместно использовать тот или иной вариант и почему.

Avatar for Moscow Python Meetup

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