Иерархия наследования для View в Django REST framework - PullRequest
0 голосов
/ 06 марта 2012

Очевидно, что вы можете иметь только один уровень наследования, когда дело касается представлений, использующих инфраструктуру Django REST.

Это работает:

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

Кто-нибудь знаетОбходной путь?

Спасибо!

РЕДАКТИРОВАТЬ: Хорошо, я понял, что могу сделать:

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"

Но это не совсем "приемлемо" в долгосрочной перспективе,Кто-нибудь знает более законный способ сделать это?

1 Ответ

0 голосов
/ 13 июня 2012

Если этот вопрос все еще стоит, я не думаю, что у нас достаточно информации, чтобы ответить на него.

Прежде всего,

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

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

, вероятно, не очень хороший код в любом случае, независимо от того, расширяет ли Foo класс View в django-rest-framework. По сути, вы нарушаете foo.get, предполагая, что у него есть метод bar, а это не так.

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

Это:

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

будет работать. Но вы по сути разорили Фу, написав это так. По крайней мере, предоставьте метод заглушки.

Несмотря на это, вы не опубликовали свой urls.py, поэтому я не уверен, пытаетесь ли вы выполнить Foo.as_view () или Bar.as_view (). Я протестировал его с помощью djangorestframework.views.View. и, как и ожидалось,

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

у меня отлично работает, тогда как,

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

не по той причине, что приведенный выше код не работает.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...