首先,我對Python很陌生& Django,所以它可能是一個簡單的問題。現在,我有這樣一個模型:Python重複使用模型繼承的視圖和表單
models.py
class Base(models.Model):
class Meta:
abstract = True
# base properties
class X(Base):
# extra props
class Y(Base):
# extra props
然後我想有X和Y的一個視圖中的一個,這將基本上做同樣的,例如:
views.py
class BaseView(object):
template_name = "app/view.html"
Type = None
def __init__(self, type):
self.Type = type
def get_context_data(self, **kwargs):
context = super(BaseView, self).get_context_data(**kwargs)
context['data'] = get_object_or_404(self.Type, pk=kwargs["id"])
return context
class XView(BaseView, generic.TemplateView):
def __init__(self):
BaseView.__init__(self, X)
class YView(BaseView, generic.TemplateView):
def __init__(self):
BaseView.__init__(self, Y)
urls.py
urlpatterns = [
url(r'^xxxx/(?P<id>[0-9]+)$', views.XView.as_view(), name="view_x"),
url(r'^yyyy/(?P<id>[0-9]+)$', views.YView.as_view(), name="view_y"),
]
這樣,我將有可能重複所有(或大部分)的形式,意見等,反正是有避免這種重複? X和Y之間的差異只是django在表單中完美生成的幾個字段。
我需要根據URL,example.com/X/或example.com/Y/來區分模型,其餘的差不多相同。
僅供參考,使用Python 3,Django 1.9。
真棒謝謝你!這是我一直在尋找的。 @DanielRoseman也是對的,不需要子類(我剛剛意識到這一點)。我會做這個選項,因爲我仍然需要自定義行爲。 –
它應該是'return super(BaseView,self)'''return'丟失。這樣,它就像一個魅力:) –