0

我正在尝试重写我的 Django 代码,以使其在所有级别上都尽可能通用。假设我有以下型号:

class Tvshow(models.Model):
    pass

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

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

电视节目有季节,季节有剧集。为简单起见,我省略了所有其他信息。

我的任何这些对象的详细视图现在可以使用 DetailView 处理任何模型。但我也想显示一个对象的关系,无论是父母还是孩子。假设您正在观看电视节目。我无法调用 tvshow.season_set.all() 来显示此信息,因为我的模板不知道它正在处理电视节目(电视节目也没有季节)。相反,我希望能够做到这一点:object.children_set.all()。

这样我就可以为这 3 个模型中的任何一个提供我的视图,并且它会起作用。这可能吗?

ps 我知道对象。部分工作,但孩子们也会部分工作吗?我能想出一个丑陋的技巧:使用 relation_name 属性来命名所有关系子项。我想它会起作用,但这不是我想要的方向。

视图.py:

from django.views.generic.detail import DetailView

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

网址.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'),
)
4

1 回答 1

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
于 2012-07-25T15:03:24.593 回答