4

次のコードは、文字通り、クラスベースのビューのフォームに関する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

1 に答える 1

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参照する順序です。

于 2013-03-22T19:36:21.437 に答える