2012-03-06 12 views
0

Django RESTフレームワークを使用したビューでは、継承レベルは1つしか設定できません。これはいませんがDjango RESTフレームワークでのViewの継承階層

class Foo(View): 
    def get(self, request): 
     return "hello world" 

を::

これは動作します

class Foo(View): 
    def get(self, request): 
     return self.bar() 

class Bar(Foo): 
    def bar(self): 
     return "hello world" 

原因as_viewのコード() http://django-rest-framework.org/_modules/views.html

は誰もが知っているに、意図的であることが表示されます回避策?

ありがとうございます!

EDIT: さて、よく私は私が行うことができますアウトが見つかりました:

class Foo(View): 
    def __init__(self): 
     View.__init__(proxy = self) 

    def get(self, request): 
     return self.proxy.bar() 

class Bar(Foo): 
    def bar(self): 
     return "hello world" 

しかし、これは長期的には本当に「許容可能」ではありません。誰もがこれを行うより正当な方法を知っていますか?

答えて

0

この質問がまだ立っている場合は、回答するための十分な情報がありません。

まず、

class Foo(object): 
    def get(self): 
     return self.bar() 

class Bar(Foo): 
    def bar(self): 
     return "hello world" 

はおそらく関係なく、fooがジャンゴ・休息・フレームワークのViewクラスを拡張するかどうか、どのような場合には良いコードではありません。基本的にfoo.getにbarメソッドがあると仮定することで、foo.getを破壊しています。

>>> foo = Foo() 
>>> foo.get() 
AttributeError: 'Foo' object has no attribute 'bar' 

この:

>>> bar = Bar() 
>>> bar.get() 

が動作します。しかし、あなたは本質的にFooをこのように書いてしまいました。少なくともスタブメソッドを提供する。

urls.pyを投稿していないので、Foo.as_view()やBar.as_view()を実行しようとしているかどうかわからないので、djangorestframework.viewsでテストしました。予想通りビュー、および、

urlpatterns = patterns('', 
    url(r'^$', Foo.as_view(), name='home'), 
) 

は、上記のコードは動作しないのと同じ理由でない、一方

#urls.py 
from testviews.views import Foo, Bar 
urlpatterns = patterns('', 
    url(r'^$', Bar.as_view(), name='home'), 
) 

は、私のために正常に動作します。

関連する問題