2012-07-25 52 views
0

我試圖重寫我的Django代碼,使其在所有級別上儘可能通用。說我有以下型號:Django以通用方式上下關係

class Tvshow(models.Model): 
    pass 

class Season(models.Model): 
    tvshow = models.ForeignKey(Tvshow) 

class Episode(models.Model): 
    season = models.ForeignKey(Season) 

一個tvshow有四季之分,一個賽季有發作。爲了簡單起見,我留下了所有其他信息。

我的任何這些對象的詳細視圖現在可以通過使用DetailView來處理任何模型。但我也想展示一個對象的關係,無論是父母還是孩子。假設您正在查看電視節目。我無法調用tvshow.season_set.all()來顯示此信息,因爲我的模板不知道它處理的是tvshow(也不是tvshows有季節)。相反,我想能夠做到這一點: object.children_set.all()。

這樣我就可以提供我的視圖任何這3種模型,它會工作。這可能嗎?

p.s.我知道這個對象。部分作品,但孩子們也會參與工作嗎?有一個醜陋的黑客我能夠想出:使用relation_name屬性來命名所有關係的子項。我想它會起作用,但這不是我想要採取的方向。

views.py:

from django.views.generic.detail import DetailView 

class ObjectDetailView(DetailView): 
    template_name = "detail.html" 

urls.py

from tvshows.views import ObjectDetailView 
from tvshows.models import Tvshow 

urlpatterns = patterns('tvshows.views', 
    url(r'^(?P<pk>\d+)/$', ObjectDetailView.as_view(model = Tvshow), name='detail'), 
) 

回答

0

不幸的是,沒有,有沒有辦法做到這一點。但是,如果您唯一的目標是擁有適用於所有三種視圖的一個視圖,則可以執行類似操作:

class MyDetailView(DetailView): 
    ... 
    def get_context_data(self, **kwargs): 
     context = super(MyDetailView, self).get_context_data(**kwargs) 
     if hasattr(context['object'], 'season_set'): 
      context['children'] = context['object'].season_set.all() 
     elif hasattr(context['object'], 'episode_set'): 
      context['children'] = context['object'].episode_set.all() 

     return context 
+0

感謝您的幫助。這會起作用,壞它總是要這樣,因爲這樣我仍然需要在某處定義規則。這意味着它不是真正的通用。 我想我會解決它通過爲每個將從一個通用的父母繼承不同的模板。 – tBuLi 2012-07-29 11:40:42