2013-03-22 72 views
3

下面的代碼是從字面上Django documentation about forms in class-based viewsClassName(object)中的super(ClassName,self)是做什麼用的? (在Django文檔使用)

import json 

from django.http import HttpResponse 
from django.views.generic.edit import CreateView 

class AjaxableResponseMixin(object): 
    """ 
    Mixin to add AJAX support to a form. 
    Must be used with an object-based FormView (e.g. CreateView) 
    """ 
    def render_to_json_response(self, context, **response_kwargs): 
     data = json.dumps(context) 
     response_kwargs['content_type'] = 'application/json' 
     return HttpResponse(data, **response_kwargs) 

    def form_invalid(self, form): 
     if self.request.is_ajax(): 
      return self.render_to_json_response(form.errors, status=400) 
     else: 
      return super(AjaxableResponseMixin, self).form_invalid(form) 

    def form_valid(self, form): 
     if self.request.is_ajax(): 
      data = { 
       'pk': form.instance.pk, 
      } 
      return self.render_to_json_response(data) 
     else: 
      return super(AjaxableResponseMixin, self).form_valid(form) 

class AuthorCreate(AjaxableResponseMixin, CreateView): 
    model = Author 

我不明白的代碼是super(AjaxableResponseMixin, self)。我知道super(ChildClass, self)用於在子類的代碼中調用父類的方法。但是AjaxableResponseMixin沒有任何父母!這是做什麼的?

回答

4

AuthorCreateAjaxableResponseMixin的超級類將是CreateView

>>> class a(object): pass 
... 
>>> class b(object): pass 
... 
>>> class c(a,b): pass 
... 
>>> c.mro() 
[<class '__main__.c'>, <class '__main__.a'>, <class '__main__.b'>, <type 'object'>] 

mro()是 「方法解析順序」,這super指的順序。

+0

我知道mro,但我不知道super可以這樣使用!謝謝。 – Bentley4 2013-03-22 19:39:37

+1

不幸的是,我無法在將多個繼承,超級和MRO聯繫在一起的文檔中找到一個很好的單點,但是:http://docs.python.org/2/tutorial/classes.html#multiple-inheritance – 2013-03-22 20:59:10

相關問題