#16931: "get_context_data" should follow MRO
-------------------------+-------------------------------
 Reporter:  linovia      |          Owner:  nobody
     Type:  New feature  |         Status:  new
Milestone:               |      Component:  Generic views
  Version:  1.3          |       Severity:  Normal
 Keywords:               |   Triage Stage:  Unreviewed
Has patch:  0            |  Easy pickings:  0
    UI/UX:  0            |
-------------------------+-------------------------------
 Actually, mixins do not allow to cumulate the context building.

 For example:

 class CommentMixin(FormMixin, SingleObjectMixin):
     pass

 In that case, we expect both FormMixin and SingleObjectMixin to build
 their context.
 However, as none of them use super in their get_context_data do use super,
 we only get the FormMixin context.

 The reason to use super here is not to call the parent get_context_data
 but the next class in MRO.

 {{{
 class A(object):
     def a(self):
         print "A"
         if hasattr(super(A, self), 'a'):
             super(A, self).a()


 class B(object):
     def a(self):
         print "B"
         if hasattr(super(B, self), 'a'):
             super(B, self).a()


 class C(object):
     def a(self):
         print "C"


 class D(B, A):
     pass


 class E(C, A):
     pass


 print "MRO:", [x.__name__ for x in D.__mro__]
 d = D()
 d.a()

 print "MRO:", [x.__name__ for x in E.__mro__]
 e = E()
 e.a()
 }}}

 With that example, one can see that d calls both B then A while e only
 calls C.

 While this might usually be unnoticed, it prevents Mixin to be chained.
 For example, mixing a single object item with a list (for a shop: one
 category with the associated products, for a bug tracker: a milestone with
 the associated tickets) or a single item with a form such as a post with a
 comment form.

-- 
Ticket URL: <https://code.djangoproject.com/ticket/16931>
Django <https://code.djangoproject.com/>
The Web framework for perfectionists with deadlines.

-- 
You received this message because you are subscribed to the Google Groups 
"Django updates" group.
To post to this group, send email to django-updates@googlegroups.com.
To unsubscribe from this group, send email to 
django-updates+unsubscr...@googlegroups.com.
For more options, visit this group at 
http://groups.google.com/group/django-updates?hl=en.

Reply via email to