2012-07-25 2 views
0

모든 레벨에서 장고 코드를 최대한 일반화하기 위해 코드를 다시 작성하려고합니다. 다음 모델이 있다고 가정 해보십시오.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를보고 있다고 가정 해 봅시다. 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

관련 문제